繁体   English   中英

JavaScript中构造函数指针的行为背后的原理是什么?

[英]What is the rationale behind the behavior of constructor pointer in JavaScript?

考虑简单的情况:

function Base() {}
function Child() {}
Child.prototype = new Base;

我想知道为什么Child实例将构造函数属性设置为Base而不是Child?

这与继承在JavaScript中的工作方式息息相关。 检查此链接以获取详细说明(基本上, constructor只是原型的另一个属性)。

编辑:此外,如果您想要“真实的”原型继承,则必须使用某种克隆功能,例如

function clone(obj) {
    if(typeof obj !== 'undefined') {
        arguments.callee.prototype = Object(obj);
        return new arguments.callee;
    }
}

然后,你可以做这样的事情

function Base() {}
function Sub() {}
Sub.prototype = clone(Base.prototype);

var obj = new Sub;

而且您仍然会true两次

document.writeln(obj instanceof Sub);
document.writeln(obj instanceof Base);

解决方案的不同之处在于,不会调用Base()并且Sub.prototype将仅继承Base.prototype的属性-而不继承构造函数中设置的属性。

function Base() {}
//Base.prototype.constructor === Base
function Child() {}
//Child.prototype.constructor === Child;
var b = new Base;
//b.constructor = Base;
Child.prototype = b;
//Child.prototype.constructor === Base

基本上,原型的任何属性都将成为实例的属性,包括“构造函数”

当您将整个原型属性重新分配给一个新对象时,您将用新的原型属性替换旧的构造函数。

如果您不希望发生这种情况,则必须将属性一一分配给原型对象,而不是一次将整个原型属性分配给一个新对象。 或随后替换旧的构造函数属性。

更好的主意是:不要依赖任何重要的构造函数属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM