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

时间:2019-02-25 15:49:00

标签: javascript inheritance prototype

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

方式1:

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

way2:

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;的顺序是错误的。

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

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

1 个答案:

答案 0 :(得分: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;
}
相关问题