Utilizzando l'operatore instanceof non si verifica se qualcosa è stato creato da un determinato costruttore, ma se qualcosa eredita da un determinato oggetto (se un determinato oggetto si trova nella catena di un prototipo di qualcosa). foo instanceof F ha esattamente lo stesso risultato di un ricorsiva * Object.getPrototypeOf(foo) === F.prototype
var F = function() {};
var foo = new F();
foo instanceof F // true
Object.getPrototypeOf(foo) === F.prototype // true
F.prototype = {}; // changed the prototype of F
foo instanceof F // false
Object.getPrototypeOf(foo) === F.prototype // false
foo instanceof Object // true
Object.getPrototypeOf(Object.getPrototypeOf(foo)) === Object.prototype // true
Con questo in mente, è abbastanza evidente che se non si cambia il prototipo di una funzione per un oggetto che non eredita da Object.prototype, tutte le istanze create con quella funzione come costruttore erediteranno da Object.prototype, quindi saranno istanze di Object.
F.prototype = Object.create(null);
var bar = new F();
bar instanceof F // true
bar instanceof Object // false
Riferimento: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
instanceof
spessore (soli scopi teorici, non v'è alcuna utilità pratica per esso):
function instanceOf(object, constructor) {
if (!object) return false;
var object = Object.getPrototypeOf(object);
if (object === constructor.prototype) return true;
return instanceOf(object, constructor);
}
Dove hai provato? – PSL
Riga di comando di Google Chrome. – KingKongFrog
Deve essere "true" solo. Dove l'hai preso come "falso"? – PSL