什么's在对象内部创建原型方法的缺点

What's the disadvantage of creating prototype methods inside the object?

本文关键字:原型 创建 方法 缺点 内部 对象 什么      更新时间:2023-09-26

我见过人们在创建javascript对象时采取两种方法,他们有时在主对象之外定义原型函数,有时在内部定义原型函数。在对象内部定义原型函数有使用私有变量和函数的优势,在外部定义它有什么优势?

function something (params) {
  this.name = params.name;
  this.color = params.color;
  _someprivatefunction = function () {};
  something.prototype.publicFunction = function () {_someprivatefunction() };
}

与相反

function something (params) {
  this.name = params.name;
  this.color = params.color;
  _someprivatefunction = function () {};
}
something.prototype.publicFunction = function () {//can't call the private function here };

编辑:正如下面评论中所建议的,这是第三个选项(但现在的问题是私有函数无法访问构造函数中的任何私有变量。)

(function () {
  function something (params) {
    this.name = params.name;
    this.color = params.color;
   }
   _someprivatefunction = function () {};
   something.prototype.publicFunction = function () {_someprivatefunction() };
 }());

我认为第一种方法的缺点是,每次实例化新对象时都要运行原型分配。似乎它会破坏使用原型的目的,因为它确实为创建的每个实例处理对象。

正如我所知,您的两个代码块不提供相同的功能。第一个选项允许您调用_someprivatefunction()或其他私有构造函数变量,而第二个选项则不允许。所以,首先你必须决定这是否是一项要求。您的两个选项没有提供同等的功能。

如果你确实想访问私人功能,那么第三个选项如下:

function something (params) {
    // initialize data members
    this.name = params.name;
    this.color = params.color;
    // initialize private members
    var aPrivateInstanceVar = 4;
    // define private function
    _someprivatefunction = function () { console.log(aPrivateInstanceVar);};
    // define public method with access to private members and functions
    this.publicFunction = function () {_someprivatefunction() };
}

这个新选项在技术上与您的第一个选项相同。但是(这可能只是我的看法),它感觉更干净。它是在创建时为对象动态分配属性,这比在对象创建时为原型分配属性更常见(就像分配给this.namethis.color一样)。

此外,如果我遇到别人写的一些未注释的代码,其中包含了你的第一个构造,我的第一个想法是:"天哪,为什么不在构造函数之外完成原型的赋值呢?"我甚至可能试图"修复"它,而没有意识到它需要在那里。但是,如果我遇到了我提出的结构,它会像一个非常常见的设计模式,我不会试图"修复"代码(在这个过程中意外地破坏了它)。