gpt4 book ai didi

javascript - this.constructor.prototype -- 不能完全覆盖,但可以写个别 Prop ?

转载 作者:行者123 更新时间:2023-11-30 08:03:58 24 4
gpt4 key购买 nike

TL;DR? 为什么我不能从构造函数中覆盖构造函数的原型(prototype)?

我正在找出我的原型(prototype)继承模式。我不喜欢原型(prototype)通常是如何从构造函数外部定义的,并且希望在逻辑上更好地封装事物。

我发现我期望的那条神奇的线并没有起作用。

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,但我无法像在构造函数定义之外的方式一样覆盖整个原型(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);
//...
}

为什么我不能从构造函数内部覆盖构造函数的原型(prototype)?但我可以在构造函数之外覆盖?在构造函数中单独编写属性?

最佳答案

Why can't I overwrite a constructor's prototype from within the constructor?

你可以,但为时已晚。新实例已经生成,继承自旧原型(prototype)。也许阅读 how new works .

I don't like how prototypes are usually defined externally from a constructor.

事情就是这样。您真的不应该从构造函数中设置原型(prototype)——它会在每次创建新实例时执行。这正是原型(prototype)不应该是的。另见 Assigning prototype methods *inside* the constructor function - why not?

and want to logically encapsulate things better.

您可能想看看各种(揭示)module patterns .或者甚至可能在某些 Class 框架中。

I'm currently looking for more concrete reasons that I should not go forth with the pattern I've been presenting.

它在 Internet Explorer 中不起作用。它不会在任何不支持 __proto__ 属性的 ES5 兼容环境中工作。你永远不应该使用它在现有对象上设置原型(prototype)。相反,使用 Object.create (或其垫片)用于 Correct javascript inheritance - 这要求您覆盖构造函数之外的原型(prototype)。

我的建议是在构造函数之外调用您的extend 助手在它上面,它仍然有一个很好的语法。

关于javascript - this.constructor.prototype -- 不能完全覆盖,但可以写个别 Prop ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21296559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com