2012-07-15 16 views
12

Özellikle, nesnel yönelimli programlama ile sınıfları ve neyi simüle etmediğimi JavaScript ile oynuyordum. Ben AnotherClass yapıcısı çağırmak için gerekli nasıl ben beğenmedim, Kalıtım için prototip kopyalansın mı?

ben devralma

MyClass.prototype = new AnotherClass(); 

ulaşma bu şekilde haberi Ama memnun değildi. Bu yüzden etrafta oynuyordum ve işe yarayan ve temelde ikinci bir fikir isteyen bir şey buldum. Prototip klonlama ile

function clone (obj) 
{ 
    function CloneFactory() {} 
    CloneFactory.prototype = obj; 

    return new CloneFactory(); 
} 

MyClass.prototype = clone(AnotherClass.prototype); 

bunun yeni bir kopyasını almak ve kalıtsal özelliklerini değiştirerek ebeveynin prototipin özelliklerini etkilemeyecek şekilde MyClass 'ın prototip olduğunu atayın. Bunun gibi MyClass.prototype = AnotherClass.prototype olur.

Stres testleri yaptım ve bu, belirli durumlarda daha verimlidir, yani ebeveynin yapıcısında çok fazla kod olduğunda, aksi halde aynıdır. Başka bir fayda (ya da en azından yararlı olduğunu buluyorum), alt sınıflardan gizlenen bilgilerin bir dereceye kadar izin vermesidir. Herhangi bir ayrıcalıklı yöntem ve üye devralınmayacak.

Baktığım bazı büyük tuzaklar var mı?

Aslında ben JavaScript için oldukça yeni, JavaScript ile bir uzman değilim, bu yüzden ben Google üzerinden bir şey bulmak gibi olamaz çünkü bu konuda ikinci bir görüş almak istiyorum. Kötü kod uygulamak istemiyorum :)!

cevap

17

Bu yaklaşık tam olarak ne Object.create yapar. Yazdığınız işlev, bu yöntem için oldukça standart bir "polyfill" dir.

Bu daha yakından "gerçek" prototypal mirasını yansıtacak şekilde nesne oluşturma soyutlama gerçekten yaygın bir yoldur. İşleri yapmak için kesinlikle güvenli bir yol. bunlar aslında koduna hemen hemen aynıdır polyfill içerdiğini https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

Sen fark edeceksiniz altındaki: Eğer ilgileniyorsanız

Oh ve burada, Object.create için MDN girişi için bir bağlantı var bazı güvenlik kontrolleri ve değişken isimleri için tasarruf edin.

+0

teşekkürler! Hatta şimdiye kadar Object.create' 'bilmiyordum. – SpaceFace