2013-06-13 13 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 

Warum ist das „instanceof“ Ergebnis nicht „falsch“, weil die „Konstruktor“ nicht auf sich selbst bezieht, sondern die geerbte Prototyp?Verwirrend „instanceof“ Ergebnis

+0

Vielleicht sollten Sie lesen, worauf sich die 'constructor' Eigenschaft bezieht. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor –

+2

als eine Notiz, müssen Sie keine Zeichenfolge Verkettung für 'console.log', es kann nehmen Sie mehrere Argumente und geben Sie bessere Daten, wenn Sie Argumente separat übergeben: 'console.log ('Bar.prototype.constructor === Foo", Bar.prototype.constructor === Foo); ' – zzzzBov

+0

die Dokumente für instanceof sind [hier] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof) – Andbdrew

Antwort

6

instanceof verwendet nicht die constructor Eigenschaft. Es ruft intern die Methode [HasInstance] des Funktionsobjekts auf, die in §15.3.5.3 of the specification beschrieben ist.

Es vergleicht den Prototyp des Objekts (und den Prototyp des Prototyps des Objekts usw.) mit der prototype-Eigenschaft der Funktion.

Eine ähnliche Implementierung wäre:

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; 
} 

Soweit ich weiß, die constructor Eigenschaft wird nicht durch interne Verfahren verwendet wird, nur durch Benutzercode erzeugt.

+0

Kurz und bündig! Schreiben MDN so leserlich? Es gibt einen kleinen Tippfehler, um die Prototypkette aufwärts zu untersuchen, d. H. "Object.getPrototypeOf (Object.getPrototypeOf (obj)) === objCtor.prototype". – sof

+0

Ich habe gerade den Code aktualisiert;) Aber danke! –

+0

Verstanden, danke! – sof

1
Bar.prototype = new Foo() 

daher

Bar.prototype instanceof Foo 

daher

Bar.prototype.contructor === Foo 

Constructor einen Verweis auf die eigentliche Funktion

Instanceof

kehrt

Der Unterschied zwischen instanceof und der Konstruktoreigenschaft (abgesehen von dem offensichtlichen syntaktischen Unterschied) ist, dass instanceof die Prototypkette des Objekts untersucht.

So:

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

Die oben genannten sind alle wahr.

+2

dave! == Person – Andbdrew

+0

Meine Frage bezieht sich auf den 2. Test "new Bar() instanceof Bar? ". – sof

+1

^^' Bar.prototype === Foo' nein, es ist eine Instanz von Foo. –