2016-08-02 22 views
5

javascript'te object.prototype işlevinin nasıl çalıştığını öğrenmeye çalışıyordum, sonra bu kod parçasına rastladım.JavaScript nesnesi prototipi Zehirlenme

// 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 satır numarası 3'te tanımlandığı ve özelliği bar bulunmaktadır tanımsız zarar bulursanız kılavuzunun değerine sahip sonra neden foo.hasOwnProperty('bar') döner, bu durumda false

+1

MDN [hasOwnProperty belgesindeki belgeleri] okumak için en iyisi (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) –

+1

* yoktur * it, it * miras alır. Tüm prototipler bu. – Bergi

cevap

4

JavaScript'deki tüm nesneler, Object dan geliyor. Tüm nesneler, Object.prototype'dan yöntem ve özellikleri devralır. Örnekte

sen foo.bar elde etmeye çalışmak

, bu foo içinde bar bulamazsa, bu nedenle foo prototip olacak ve orada bulmaya çalışır edilir.

hasOwnProperty - yalnızca tam olarak foo ürününüzde bulunan bir özelliği denetler. İşte

Eğer bu bölümü okuyabilirsiniz derin anlamak için enter image description here

sevdiği foo bir şey.

You Don't Know JS

0

foo nesnenin, çünkü bar özelliğine sahiptir Nesne prototipine bar olarak Object olarak eklenmiştir. foobar tanımladığından foo.hasOwnProperty('bar') yanlış döndürür, Object yapar.

+0

ama orada; foo.bar yazdık. foo'da bar adında bir özellik oluşturmuyorlar. Mülkiyet yaratmak için bu foo ['bar'] ' – ankyAS

+0

@ankyAS No gibi yazılmalıdır. Bu özellik zaten mevcuttu, ancak Foo'nun özelliği yok. Foo, Object'ten devraldığı için, Bar dahil olmak üzere Object'in bildirdiği tüm özellikleri alır. – Tibrogargan

0

Basit goo foo doğrudan mülkiyet, ancak prototip zincirini çapraz için gereklidir bar almak için bu. hasOwnProperty yalnızca doğrudan özelliğini kontrol ediyor.

İlgili konular