2013-06-13 17 views
5
function Foo() {} 

    function Bar() {} 

    Bar.prototype = new Foo() 

    console.log("Bar.prototype.constructor === Foo ? " 
    + (Bar.prototype.constructor === Foo)) 

    console.log("new Bar() instanceof Bar? " 
    + (new Bar() instanceof Bar)) 
=> Bar.prototype.constructor === Foo ? true 
=> new Bar() instanceof Bar? true 

Perché è il "instanceof" risultato non "false", perché il "costruttore" non si riferisce a se stesso, ma il prototipo ereditato?Confondere "instanceof" risultato

+0

Forse dovresti leggere su cosa effettivamente si riferisce la proprietà 'constructor'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor –

+2

come nota, non è necessario utilizzare la concatenazione di stringhe per 'console.log', può prendere più argomenti e darti dati migliori se passi argomenti separatamente: 'console.log ('Bar.prototype.constructor === Foo", Bar.prototype.constructor === Foo); ' – zzzzBov

+0

i documenti per esempio di sono [qui] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof) – Andbdrew

risposta

6

instanceof non utilizza la proprietà constructor. Richiama internamente il metodo [HasInstance] dell'oggetto funzione, che è descritto in §15.3.5.3 of the specification.

Confronta il prototipo dell'oggetto (e il prototipo del prototipo dell'oggetto, ecc.) Con la proprietà prototype della funzione.

Una simile realizzazione potrebbe essere:

function myInstanceOf(obj, Constr) { 
    // get prototype of object 
    var proto = Object.getPrototypeOf(obj); 

    // climb up the prototype chain as long as we don't have a match 
    while (proto !== Constr.prototype && proto !== null) { 
     proto = Object.getPrototypeOf(proto); 
    } 

    return proto === Constr.prototype; 
} 

quanto ne so, la proprietà constructor non viene utilizzato mediante qualsiasi metodo interne, solo dall'utente codice generato.

+0

Conciso e concreto! MDN scrive in modo leggibile? C'è un errore tipografico per ispezionare la catena del prototipo verso l'alto, ad esempio 'Object.getPrototypeOf (Object.getPrototypeOf (obj)) === objCtor.prototype'. – sof

+0

Ho appena aggiornato il codice comunque;) Ma grazie! –

+0

Capito, grazie! – sof

1
Bar.prototype = new Foo() 

quindi

Bar.prototype instanceof Foo 

quindi

Bar.prototype.contructor === Foo 

costruttore restituisce un riferimento alla funzione effettiva

InstanceOf

La differenza tra instanceof e la proprietà del costruttore (a parte l'ovvia differenza sintattica) è che instanceof ispeziona la catena di prototipi dell'oggetto.

Quindi:

=> new Bar() instanceof Foo? true 
=> new Bar() instanceof Bar? true 
=> new Bar() instanceof Object? true 

Quanto sopra sono tutte vere.

+2

dave! == Persona – Andbdrew

+0

La mia domanda riguarda il secondo test "nuova barra() istanza di barra? ". – sof

+1

^^' Bar.prototype === Foo' no, è un'istanza di Foo. –