gpt4 book ai didi

javascript 继承 : Instance vs prototype

转载 作者:行者123 更新时间:2023-12-04 00:58:07 25 4
gpt4 key购买 nike

当使用继承时,ChildObject.prototype = new ParentObject();ChildObject.prototype = ParentObject.prototype; 之间有什么区别,哪种方法更好.

我在 Douglas Crockford 示例中看到了 ChildObject.prototype = new ParentObject();

最佳答案

都不是

相反:

ChildObject.prototype = Object.create(ParentObject.prototype);
ChildObject.prototype.constructor = ChildObject;

结合ChildObject开头的这一行:

ParentObject.call(this/*, appropriate args if any*/);

或者如果传递所有参数:

ParentObject.apply(this, arguments); // `arguments` literally -- it's provided by the JavaScript engine

ChildObject.prototype = new ParentObject(); 的问题在于,如果 ParentObject 像许多(大多数?)构造函数那样需要参数,它就无法工作。因此,该模式在常见(可能是大多数)情况下不起作用。

ChildObject.prototype = ParentObject.prototype; 的问题在于,您让它们都指向同一个对象。因此,在 ChildObject.prototype 上设置属性会使它显示在 ParentObject 的实例上(因为您刚刚在 ParentObject.prototype 上设置了它作为好吧)。

Object.create 版本推迟调用 ParentObject 直到你有一个对象要初始化,但给你一个对象,你可以在上面放置特定于 的东西ChildObject 实例。 (constructor 反向链接是为了使替换对象看起来像 ChildObject 最初的默认对象;这在过去并不重要,但现在 ES6 实际上使用了它在某些情况下,有些库之前使用过它,即使 ES5 和更早版本没有[他们只是把它放在那里]。)

最后:Object.create 的单参数版本在 2009 年之前被添加到 ES5 中时可以为过时的浏览器填充,或者如果你不这样做,你可以使用工厂函数代替像部分匀场的东西:

function objectCreate(proto) {
function ctor() { }
ctor.prototype = proto;
return new ctor;
}

关于javascript 继承 : Instance vs prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32592560/

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