特尔;博士? 为什么我不能从构造函数内部覆盖构造函数的原型?
我正在弄清楚我的原型继承模式。我不喜欢通常如何从构造函数外部定义原型,并希望在逻辑上更好地封装事物。
我发现我希望工作的一条神奇的线路没有。
function Orifice(){
this.exhaust=function(){};
this.ingest=function(){};
}
var standardOrifice = new Orifice();
function Sphincter(){
this.constructor.prototype = standardOrifice; // <-- does not work
this.relax=function(){};
this.tighten=function(){};
}
有趣的是,我可以将单个属性写入this.constructor.prototype
,但我不能像在构造函数定义之外一样覆盖整个原型对象。
所以像这样的东西有效:
this.constructor.prototype.exhaust = standardOrifice.exhaust;
this.constructor.prototype.ingest = standardOrifice.ingest;
为此,我可以创建一个简单的克隆函数来处理此问题:
function extend(target){
return {
from: function(obj){
target.__proto__ = obj.constructor.prototype;
for (key in obj) if (obj.hasOwnProperty(key)) target[key]=obj[key];
return target;
}
};
}
值得庆幸的是,到目前为止,在我的测试中,这种技术似乎运行良好,但我不确定是否有可能遗漏的细节或性能案例。
function Sphincter(){
extend(this.constructor.prototype).from(standardOrifice);
//...
}
为什么我不能从构造函数内部覆盖构造函数的原型?然而我可以在构造函数之外吗?并在构造函数中单独编写属性?