我有一个充当基类的函数,我想为它添加方法。我可以通过名称(在函数外部)添加方法到函数的原型,或者不引用函数的名称(在函数内部):
1)参考名称
Base.prototype.getResult = function () {
return 5;
}
2)不要引用名称
function Base() {
this.constructor.prototype.getResult = function () {
return 5;
}
}
我很好奇这两种方法之间有什么区别(含义是什么)?
编辑:
更新了我的问题以包含 Jacob Krall 建议的示例:
这意味着Base.prototype.getResult
将被定义,直到构造第一个Base
对象为止(例如,您不能使用Base.getResult.apply(this)
在不同类型的对象上调用它,直到第一个Base
对象已创建
function Base() {
this.constructor.prototype.getResult3 = function () {
return alert(this.variable);
}
}
Base.prototype.getResult2 = function () {
return alert(this.variable);
}
var o = {
"variable":5
};
Base.prototype.getResult2.call(o); //works
try {
Base.prototype.getResult3.call(o); //doesn't work
} catch(e) {
alert('exception is catched');
}
var base = new Base();
base.getResult3.call(o); //works
答案 0 :(得分:2)
在第一个示例中,您在每个getResult
对象的原型上设置Base
。这发生在程序执行开始时,很容易推理。我建议这样做。
在第二个示例中,每次构建getResult
时,都会在每个Base
对象的原型上设置new Base()
。
这意味着Base.prototype.getResult
将为undefined
,直到构造第一个Base
对象为止(例如,您不能使用Base.getResult.apply(this)
在不同类型的对象上调用它直到第一个Base
对象被创建之后,这很奇怪)。其次,这样做是浪费的,因为每次调用构造函数时都会创建一个新的Function
并将其分配给Base.prototype.getResult
。
答案 1 :(得分:1)
如果将它们添加到原型中,它们将被初始化一次并在所有实例之间共享。这将节省CPU和内存,可以轻松地为所有现有实例更改它并具有继承性(其中instanceOf为true,因为Parent.call(this)不会)。
每次创建实例时重新启动原型或部分原型都没有多大意义。
原型的作用以及构造函数体或原型中用this.someProp
定义的属性之间的差异被解释为here。