每次調用extendAndInstantiate
一個新的對象是使用{}
創建,它被指定爲原型時間的SomeConstructorFunction
。這將清除現有實例和SomeConstructorFunction
之間的鏈接。所以只有最後一個纔是SomeConstructorFunction
的有效實例。
function SomeConstructorFunction() {
}
function extendAndInstantiate(constructorFn) {
constructorFn.prototype = {}; //New instance as prototype
return new constructorFn();
}
var child1 = extendAndInstantiate(SomeConstructorFunction);
console.log(child1 instanceof SomeConstructorFunction); //true
var child2 = extendAndInstantiate(SomeConstructorFunction);
console.log(child1 instanceof SomeConstructorFunction); //false
console.log(child2 instanceof SomeConstructorFunction); //true
var child3 = extendAndInstantiate(SomeConstructorFunction);
console.log(child1 instanceof SomeConstructorFunction); //false
console.log(child2 instanceof SomeConstructorFunction); //false
console.log(child3 instanceof SomeConstructorFunction); //true
因此,要麼你可以按照法顯示由@ ben336或如下所示指定原型之前做健康檢查。
function Base(){
}
function SomeConstructorFunction() {
}
function extendAndInstantiate(constructorFn, Base) {
if(!(constructorFn.prototype instanceof Base)){
console.log(" extend only once ");
constructorFn.prototype = new Base();
}
return new constructorFn();
}
var child1 = extendAndInstantiate(SomeConstructorFunction, Base);
console.log(child1 instanceof SomeConstructorFunction); //true
var child2 = extendAndInstantiate(SomeConstructorFunction, Base);
console.log(child1 instanceof SomeConstructorFunction); //true
console.log(child2 instanceof SomeConstructorFunction); //true
var child3 = extendAndInstantiate(SomeConstructorFunction, Base);
console.log(child1 instanceof SomeConstructorFunction); //true
console.log(child2 instanceof SomeConstructorFunction); //true
console.log(child3 instanceof SomeConstructorFunction); //true
對原型繼承的很好的解釋。我認爲OP的困惑在於'constructorFn.prototype = {}; //可以是任何原型。他期望將原型設置爲相同的**值**將導致'instanceof'爲true,相反,它們應該設置爲相同的**引用**。 – MattDiamant 2013-03-19 15:32:57
@MattDiamant - 我同意。我不知道OP使用'extendAndInstantiate'試圖完成什麼,但我相信它有點像我自己的'instantiate'函數在下面的問題:http://stackoverflow.com/q/11490606/783743 – 2013-03-19 15:36:28
好解釋。最重要的是,我錯過了將原型設置爲'{}'有效地將'SomeConstructorFunction'類型更改爲'Object'的事實。 'SomeConstructorFunction.constructor'是'function Object ...'。 – Stephen 2013-03-19 17:07:24