Wenn ein Prototyp für eine Konstruktorfunktion festgelegt wird, gibt der Operator instanceof
nur true
zurück, bis der Prototyp geändert wird. Warum?instanceof-Operator gibt false bei der nachfolgenden Änderung der Vererbungskette zurück
function SomeConstructorFunction() {
}
function extendAndInstantiate(constructorFn) {
constructorFn.prototype = {}; //Can be any 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
Große Erklärung der prototypischen Vererbung. Ich denke, die Verwirrung von OP liegt in 'constructorFn.prototype = {}; // Kann jeder Prototyp sein. Er erwartet, dass das Setzen des Prototyps auf den gleichen ** Wert ** dazu führt, dass "instanceof" wahr ist, wenn sie stattdessen auf die gleiche ** Referenz ** gesetzt werden sollen. – MattDiamant
@MattDiamant - stimme zu. Ich weiß nicht, was das OP mit "extendAndInstantiate" zu erreichen versucht, aber ich glaube, es ist ein bisschen wie meine eigene 'instanziate'-Funktion in der folgenden Frage: http://stackoverflow.com/q/11490606/783743 –
Gute Erklärung . Am wichtigsten ist, dass mir die Tatsache fehlte, dass man den Typ von 'SomeConstructorFunction' in' Object' ändert, wenn man den Prototyp auf '{}' setzt. 'SomeConstructorFunction.constructor' ist' function Object ...'. – Stephen