我注意到在各种教程中向“类”添加函数的不同方法。第一个是在类的构造函数中:
Class = function () {
this.doSomething = function() {...};
}
另外一个是:
Class = function () {}
Class.prototype.doSomething = function() {...};
在哪些情况下应该使用其中一种而不是另一种?
我对 Javascript 中没有
protected
属性或方法的理解是否正确?如果是的话,应该用什么来代替?
当您在构造函数内将函数定义为
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() {