Javascript:何时在构造函数中定义函数以及何时使用原型?

问题描述 投票:0回答:1

我注意到在各种教程中向“类”添加函数的不同方法。第一个是在类的构造函数中:

Class = function () {
    this.doSomething = function() {...};
}

另外一个是:

Class = function () {}
Class.prototype.doSomething  = function() {...};

在哪些情况下应该使用其中一种而不是另一种?

我对 Javascript 中没有

protected
属性或方法的理解是否正确?如果是的话,应该用什么来代替?

javascript prototype
1个回答
14
投票

当您在构造函数内将函数定义为

this.myFunction=...
时,它特定于您的实例。这意味着它必须为所有实例构建并保存在内存中,这可能会很重。也不能遗传。

这样做的唯一正当理由是:

  • 具体值的括起来
  • 其他类型的特定函数(您可能每次都会构建不同的函数)

大多数情况下,您真正需要的是原型上定义的函数。

来自对象的 MDN :

JavaScript中的所有对象都是Object的后代;所有对象 从 Object.prototype 继承方法和属性,尽管它们 可能会被覆盖。例如其他构造函数的原型 重写构造函数属性并提供自己的 toString 方法。对对象原型对象的更改会传播到所有对象 对象,除非受这些更改影响的属性和方法是 沿着原型链进一步被覆盖。

关于您的附加问题:以下代码构建了一个不可直接访问的函数:

Class = function () {
   var imprivate = function(){...};
   this.doSomething = function() { uses imprivate};
}

缺点是每个

Class
实例都有不同的函数实例。这通常是针对 modules 完成的(您只有一个实例)。就我个人而言,我更喜欢完全按照 ThiefMaster 在评论中的建议进行操作:我在私有函数前面加上
_
:

// private method
XBasedGrapher.prototype._ensureInit = function() {
© www.soinside.com 2019 - 2024. All rights reserved.