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

Dlaczego jest „instancją” Wynik nie „false”, ponieważ „konstruktor” nie odnosi się do siebie, ale odziedziczył prototypu?Mylące „instancją” wynik

+0

Może powinieneś przeczytać na czym właściwie polega własność 'constructor'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor –

+2

jako notatkę, nie musisz używać konkatenacji ciągów dla 'console.log', może wziąć wiele argumentów i podać lepsze dane, jeśli osobno przekazujesz argumenty: 'console.log ('Bar.prototype.constructor === Foo", Bar.prototype.constructor === Foo); ' – zzzzBov

+0

dokumenty dla instanceof [tutaj] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof) – Andbdrew

Odpowiedz

6

nie używa właściwości constructor. Wewnętrznie wywołuje metodę obiektu funkcji opisaną w §15.3.5.3 of the specification.

Porównuje prototyp obiektu (i prototypu prototypu obiektu, itp.) Z właściwością prototype.

Podobna realizacja będzie:

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

O ile mi wiadomo, nieruchomość constructor nie jest używany przez wszelkich metod wewnętrznych, tylko przez użytkownika wygenerowany kod.

+0

Zwięzłe i konkretne! Czy MDN pisze tak czytelnie? Istnieje drobna literówka do sprawdzania prototypowego łańcucha w górę, tj. 'Object.getPrototypeOf (Object.getPrototypeOf (obj)) === objCtor.prototype'. – sof

+0

Właśnie zaktualizowałem kod;) Ale dzięki! –

+0

Mam to, dzięki! – sof

1
Bar.prototype = new Foo() 

zatem

Bar.prototype instanceof Foo 

zatem

Bar.prototype.contructor === Foo 

Konstruktor zwraca odniesienia do rzeczywistej funkcji

instancją

Różnica między instanceof a właściwością constructor (poza oczywistą różnicą składniową) polega na tym, że instanceof sprawdza prototyp łańcucha obiektu.

Więc:

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

Powyższy wszystkie są prawdziwe.

+2

dave! == Osoba – Andbdrew

+0

Moje pytanie dotyczy 2. testu "nowy pasek() instanceof Bar? ". – sof

+1

^^' Bar.prototype === Foo' nie, jest instancją Foo –