2016-08-02 10 views
5

Próbowałem dowiedzieć się, jak funkcja object.prototype w javascriptie natknąłem się na ten fragment kodu. Czego nie rozumiem?Prototyp obiektu JavaScript Poisoning

// Poisoning Object.prototype 
Object.prototype.bar = 1; 
var foo = {goo: undefined}; 

foo.bar; // 1 
'bar' in foo; // true 

foo.hasOwnProperty('bar'); // false 
foo.hasOwnProperty('goo'); // true 

foo ma paska właściwości, która jest zdefiniowana w linii numer 3 i posiadające wartość nieokreśloną .please przewodnika dlaczego foo.hasOwnProperty('bar') powraca false w tym przypadku

+1

najlepiej przeczytać MDN [dokumentacja na hasOwnProperty] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) –

+1

Nie ma * go, to jest * dziedziczy * to. To jest cały punkt prototypów. – Bergi

Odpowiedz

4

Wszystkie obiekty w JavaScript pochodzą od Object. wszystkie obiekty dziedziczą metody i właściwości od Object.prototype.

W przykładzie, kiedy staramy się foo.bar, nie znajdzie bar w foo, więc to będzie prototypu foo i próbuje go tam znaleźć.

hasOwnProperty - tylko sprawdza właściwość, która jest dokładnie w twoim foo.

Oto co się foo wygląda

enter image description here

Do głębokiego zrozumienia można przeczytać ten rozdział.

You Don't Know JS

0

Przedmiotem foo ma bar właściwość, ponieważ dziedziczy go od Object, ponieważ bar został dodany do prototypu obiektu. foo.hasOwnProperty('bar') zwraca wartość false, ponieważ foo nie definiuje bar, Object ma.

+0

ale tam; napisaliśmy 'foo.bar'. nie tworzy to właściwości o nazwie bar w foo. Aby utworzyć własność, należy napisać tak: 'foo ['bar']' – ankyAS

+0

@ankyAS Nie, właściwość już istniała, ale Foo nie jest właścicielem tej właściwości. Foo dziedziczy z Object, więc pobiera wszystkie właściwości zadeklarowane przez Object, w tym bar. – Tibrogargan

0

To proste goo jest bezpośrednią własnością foo, ale aby dostać się bar wymagane jest przemierzać łańcuch prototypów. hasOwnProperty sprawdza tylko jego własność bezpośrednią.