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

Why we could first fix the constructor property and then reset the prototype?

我们重置原型实现是正常的inherit.And然后我们修复构造函数property.But为什么我们可以先修复构造函数属性然后重置原型?

方式 1:

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

方式 2:

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。

在您的最后一段中,您说语句 "fixing the constructor" 是 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;
}