2010-09-30 13 views
7

Bunun beş yıl önce tartışmalı bir konu olduğunu biliyorum, ancak bugünkü JavaScript için bazı şeylerin değişip değişmediğini merak ediyorum. Object.prototype'un uzatılmasıyla bağdaşmayan büyük bir modern kütüphanenin gerçek dünya örnekleri var mı?Javascript'te Object.prototype yöntemine yöntem eklemenin yararları ve tehlikeleri nelerdir?

Ben varsayımsal değil ilgilendiğim "Birisi ileride belki, kullanmak istediğiniz bir kütüphanede kötü for in yineleme kodunu yazabilirsiniz ve sonra garip bir hata alabilirsiniz"

+1

(http [Object.prototype erlaubt dir]: // www.thomasfrank.se/object_prototype_is_erlaubt.html) –

cevap

12

Are Object.prototype'ın genişletilmesiyle bağdaşmayan büyük bir modern kütüphanenin gerçek dünya örnekleri var mı?

Evet, örneğin az müdahaleci libraries- biridir -ki jQuery, sorunlarını hatırlamak

:

hatırladığım bir diğer olgu olmasıdır birisi işlevini Object.prototype nesnesine ekledi ve $().load olayına neden oldu:

Örnek here.

Object.prototype nesnesini bu şekilde genişletmek asla tavsiye edilmez, çünkü bu özellikler çok sayıda nesne tarafından devralınır - bazı ana nesneler tarafından da olsa - ve bildiğiniz gibi, birincil sorun sayılırlar. for-in ifadesiyle. şimdi olmayan enumerable özelliklerini ilan edebilir çünkü

ECMAScript'e 5'te

, şimdi daha güvenli bir yoldur, örneğin, mevcut: özellik tanımlayıcısı olarak

Object.defineProperty(Object.prototype, 'foo', { value: 'bar' }); 

- { value: 'bar' } - biz özellik özelliklerini belirleyebilir, durumda Değer Özellikleri yukarıdaki örnekte olduğu gibi nedeniyle, writable özelliği belirtebilirsiniz ve ortak configurable özniteliği (belirleyen bir özellik -attribute Yapılanma veya silinmiş.

yeniden yapılandırılabilir ve ayrıcavarsa Özelliğin for-in bildirimi tarafından numaralandırılıp listelenmeyeceğini belirleyenözniteliği.

biz özelliklerini belirtmek yoksa, bunlar gibi false varsayılan olarak, tanımlayıcı bakacağız şunlardır: Bu konuda güzel bir tartışma var

{ 
    value: 'bar', 
    writable: false, 
    configurable: false, 
    enumerable: false 
} 
+0

Object.prototype genişletildiğinde, jQuery ile ilgili tüm bilgiler doğru çalışmıyor. Gelecekte bir noktada etkileşime girmeyi planladıklarını okudum. Şimdilik, Object.prototype'ı çok dikkatli düşünmeden genişletmek için henüz çok erken. –

İlgili konular