Quando un prototipo è impostato su una funzione di costruzione, l'operatore instanceof
restituisce solo true
fino a quando il prototipo non viene modificato. Perché?restituisce false sulla successiva modifica alla catena di ereditarietà
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
Grande spiegazione dell'ereditarietà prototipale. Penso che la confusione dell'OP risieda in 'constructorFn.prototype = {}; // Può essere qualsiasi prototipo'. Si aspetta che l'impostazione del prototipo sullo stesso ** valore ** comporterà la presenza di 'instanceof', quando invece dovrebbero essere impostati sullo stesso ** riferimento **. – MattDiamant
@MattDiamant - Sono d'accordo. Non so cosa l'OP sta cercando di ottenere usando 'extendAndInstantiate' ma credo che sia un po 'come la mia funzione 'instantiate' nella seguente domanda: http://stackoverflow.com/q/11490606/783743 –
Buona spiegazione . Ancora più importante, mi mancava il fatto che l'impostazione del prototipo in '{}' cambia in modo efficace il tipo di 'SomeConstructorFunction' in' Object'. 'SomeConstructorFunction.constructor' è' function Object ... '. – Stephen