SORU
10 AĞUSTOS 2011, ÇARŞAMBA


Nasıl zaten başlatılmış bir JavaScript nesnesinin prototip ayarlamak için?

Bir nesne var foo JavaScript kodunu sanırım. foo karmaşık bir nesne ve başka bir yerde oluşturulur. Nasıl foo nesnenin prototip değiştirebilir miyim?

GüncellemeBurada ne yaptığım hakkında daha spesifik olmam gerektiğini fark ettim.

ASP.net bir sayfa içinde aşağıdaki JavaScript kodu yazdım varsayalım.

var foo = <%=MyData %>;

MyData yürütmesini sonucu olduğunu varsayalım .net 8 ** Dictionary<string,string> bir nesne üzerinde .net kodu.

Çalışma zamanında, bu aşağıdaki gibi olur:

var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];

Gördüğünüz gibi, foo nesnelerin bir dizi haline gelir. Uygun bir prototip ile foo başlatmak için mümkün olmak istiyorum. Nesne ya da Dizi prototip değiştirmek istemiyorum. Bunu nasıl yapabilirim?

CEVAP
23 AĞUSTOS 2011, Salı


Jun DÜZENLEYİN. 2012: cevap aşağıda artık doğru değil. _proto_ "normatif isteğe bağlı uygulanması için gerekli değildir anlamına gelir, ama bu" kurallar belirli bir dizi takip etmelidir. ecmascript6 olarak ilave ediliyor Bu halen çözülmemiş ama en azından resmi olarak JavaScript özellikli bir parçası olacak.

Bu soru göründüğünden çok daha karmaşık bir çok halklar ötesinde yüzeyde ve' yüksek maaşı Javascript iç bilgi açısından.

Bir nesnenin prototype özelliği olan nesnenin yeni çocuk nesneleri oluştururken kullanılır. Nesnenin kendisi yerine yansıtmadığı değişen diğer nesneler için yapıcı olarak kullanılır itiraz etti, ve varolan bir nesnenin prototip değişen yoktur, ne zaman yansır.

function myFactory(){};
myFactory.prototype = someOtherObject;

var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true

Nesneleri bir içsel [[prototype]] geçerli bir prototip gösteren özellik. Çalışıyor, her bir özellik bir başka nesne denir başlayacak nesneyi ve sonra da gidip aracılığıyla [[prototype]] zincir kadar bulduğu bir maç, ya da başarısız olduktan sonra kök Nesne prototip. Bu Javascript nesneleri çalışma zamanı inşa ve tadilat için izin verir, ihtiyaç duyduğu için arama için bir planı vardır.

__proto__ özellik bazı uygulamalar var (bir sürü): herhangi bir uygulama Mozilla, tüm y olanları biliyor, Diğerleri. Bu özellik puan içsel [[prototype]] ve tadilat sonrası oluşturma nesneleri verir. özellik Tüm özellikleri ve fonksiyonları anında prototip bu zincirleme arama nedeniyle maç geçecektir.

Standart şimdi olurken bu özelliği, JavaScript gerekli bir parçası değildir, ve dil kodu "" kategori. unoptimized içine aşağı vurma olasılığı daha yüksek olan destek JS motorları için ellerinden geleni sınıflandırmak kodu, özellikle "sıcak" kod erişilen çok sık ve yapıyorsan bir şey fantezi gibi değiştirme __proto__ vermiyorlar optimize kodu.

Bu mesaj https://bugzilla.mozilla.org/show_bug.cgi?id=607863 özellikle __proto__ mevcut uygulamaları ve bunların arasındaki farklar anlatılmaktadır. Her uygulama zor ve çözümsüz bir problem, çünkü farklı. Javascript her şeyin dışında kesilebilir.) sözdizimi b.) ana nesneler (DOM dışında teknik olarak Javascript var) ve c.) __proto__. Gerisi tamamen senin elinde ve her girişimci, __proto__ boğaz başparmak gibi dışarı sopa neden görebilirsiniz.

__proto__ başka türlü yapmak imkansız olduğu için sağlayan tek bir şey vardır: zamanı kurucusu ayırmak için nesneleri bir prototip belirlenmesi. Bu önemli bir durumdur ve __proto__ zaten ölü değil ana nedenlerinden biridir. Önemli bir Uyum oluşturulması ciddi bir tartışma noktası oldu bu kadar yeter, yoksa yakında ECMA 6 olarak bilinir. Oluşturma sırasında bir nesnenin prototip belirtmek için yeteneği ve bu çan __proto__'s gün resmi olarak numaralandırılmıştır. gösteren olacak Javascript bir sonraki sürümünün bir parçası olacak

Kısa vadede, eğer bunu destekleyen tarayıcılar (IE, hayır YANİ hiç) hedeflediğiniz __proto__ kullanabilirsiniz. ES6 2013 yılına kadar kesinleşmiş olmayacak gibi gelecek 10 yıl için Y ve moz içinde çalışma olasılığı yüksek.

Brendan Üzerinde- :Approach of new Object methods in ES5 Ynt:

, ... Üzgünüm ama __proto__ nesne initialiser kullanma durumu (yani, yeni bir nesne değil, henüz erişilebilir, ES5 Nesne benzer.ayrı ayarlanabilir oluşturmak), çok kötü bir fikir. Bu ve __proto__ ayarlanabilir 12 yıl önce tasarlanmış bir hayata sahip olmak için yazıyorum.

... tabakalaşma olmaması bir sorun (24 ** bir anahtar düşünün JSON veri). Ve daha da kötüsü, mutability uygulamaları ilooping önlemek için siklik prototip zincirleri kontrol gerektiği anlamına gelir.[sonsuz özyineleme için sürekli kontrol gereklidir]

Son olarak, mutasyona __proto__ varolan bir nesne Mayıs sonu genel olmayan yöntemleri yeni prototip nesne, ki muhtemelen işe alıcı (doğrudan) nesne adı __proto__ olması vardı. Bu sadece kötü bir uygulama, kasıtlı tür karışıklık bir form, genel olarak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • case LianLi

    case LianLi

    28 Mayıs 2010
  • emimusic

    emimusic

    10 Mart 2006
  • How To Cook That

    How To Cook

    16 NİSAN 2011