为什么我们可以先修复构造函数 属性 然后重置原型?
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 = subType
和 subType.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;
}
我们重置原型实现是正常的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 = subType
和 subType.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;
}