我注意到在各种教程中向“类”添加函数的不同方法。第一个是在类的构造函数中:
Class = function () {
this.doSomething = function() {...};
}
另一种是:
Class = function () {}
Class.prototype.doSomething = function() {...};
在什么情况下应该使用其中一种而不是另一种?
我的理解是没有protected
Javascript 中的属性或方法正确吗?如果是的话,应该用什么来代替?
当您在构造函数中定义函数时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() {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)