为什么我们可以先修复构造函数属性然后重置原型?

问题描述 投票:2回答:1

我们重置原型以实现继承是正常的。然后我们修复构造函数属性。但为什么我们可以先修复构造函数属性然后重置原型?

WAY1:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}

维阿:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype); 
    subType.prototype = o1;
    o1.constructor = subType;
}

当我console.log(o1.constructor)时,我发现way1和way2都可以改变o1.cobstructor。我可以理解way2,因为它在重置原型(正常)后修复了构造函数。但是way2怎么样?我无法理解way2仍然像o1.constructor = subTypesubType.prototype = o1;is的顺序错误。

PS:重置原型就像:subType. prototype= superType因为它改变了什么子类型。原型指向,我们需要修复构造函数

修复构造函数就像:subType. prototype.constructor= subType这使得subType. prototype.constructor再次指向subType。

javascript inheritance prototype
1个回答
1
投票

在你的最后一段中,你说“修复构造函数”的陈述是subType.prototype.constructor = subType;,但这不是你的代码示例中的内容。在您的代码示例中,它是o1.constructor = subType。如果它是前者那么订单就很重要,只有way2可以工作。

相反,它使用o1.constructor = subType。顺序无关紧要,因为o1没有被声明subType.prototype = o1;修改,因此它不会对o1.constructor = subType的作用产生任何影响。

这三个版本都有效:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    o1.constructor = subType;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    subType.prototype.constructor = subType;
}

但是这个没有,因为它在subType.prototype的旧值上设置构造函数属性,而不是在o1上:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype.constructor = subType;
    subType.prototype = o1;
}
© www.soinside.com 2019 - 2024. All rights reserved.