2011-08-19 15 views
8

Bugün hayatımda hiç görmediğim bir JavaScript kalıbı gördüm. Bu modeli kullanmanın amacını anlatamam. Benim için yanlış görünüyor, ama biraz muhafazakar olmak istiyorum. Daha önce hiç görmediğim harika bir desen olabilir. İlkKurucu içindeki prototip yöntemlerinin tanımlanması

function Dog() { 
    Dog.prototype.bark = function() { 
     alert('woof!'); 
    } 

    this.bark = function() { 
     Dog.prototype.bark(); 
    } 

    this.bark(); 
} 

, sebepsiz kurucu içinde (imtiyazlı üye olarak) yöntemlerini yapmak için bir hayranı değilim. Bir örnek oluşturulduğunda her seferinde işlevlerin oluşturulmasına neden olur. İkincisi, bu kod snippet'inde, "bu" yerine "Dog" prototip adını da çağırır. Bu beni çok şaşırtıyor.

Bunun hakkında iyi olan herkes bilir mi?

Teşekkürler! Grace

+1

Bu çok anlamsız görünüyor. Bildiğim kadarıyla, prototip nesnesi, tanım dışındaki bir nesnenin tüm örneklerine özellik eklemek için kullanılır. Bu tanımda olduğundan, biraz fazladır. – mowwwalker

+0

Sana tamamen katılıyorum. Bana da anlamsız geliyor. –

cevap

12

Çok sayıda sebepten dolayı bu çok kötü bir fikir. bunlardan bir kaçıdır: yapıcı prototip yöntemleri ekleme

  1. prototip yöntemi tüm örnekler için değiştirilecek neden olur, her yeni Dog örneğini.
  2. Dog.prototype.bark()'un çağrılması, this'un Dog.prototype olması ve Dog örneğinizin olamayacağı anlamına gelir; bu da ciddi sorunlara neden olabilir. Bazı ciddi WTF.
  3. this.bark = function() { Dog.prototype.bark(); }. Çünkü this.bark, bunu gereksiz kılan prototip yöntemini değerlendirecektir. Ve bunun böyle çağırılması aslında # 2'de belirtildiği gibi doğal this değerini yok eder. İşte

olduğunu olması gereken budur: alternatif

function Dog() { 
    this.makeSound(); 
}; 

Dog.prototype.bark = function() { 
    alert('woof'); 
}; 

Dog.prototype.makeSound = function() { 
    this.bark(); 
}; 

Veya hiç prototip olmadan:

function Dog() { 
    this.bark = function() { 
    alert('woof'); 
    }; 

    this.makeSound = function() { 
    this.bark(); 
    }; 

    this.makeSound(); 
}; 

Ben hiç senin bu pasajı güven olmaz.

+0

# 2: Kabuk yapıcı dışında başlatılmış olsa bile aynıdır - yöntem * bu * çağrıyla ayarlanır. # 3: # 2 ile aynıdır (* bu * *. Dog.prototype * olacaktır), ancak işlev * bu özelliği kullanmaz * bu yüzden bu durumda bir soruna neden olmaz. – RobG

+0

Neden this.makeSound = function() {} 'yapardınız? Bu örnek, açıklama yapılmadan yanıltıcı olabilir. Bu, prototip nesnesinde ayarlanamaz ve işlev, her yeni köpek(); 'için bellekte çoğaltılır. Dog.prototype.makeSound = function() {} 'için daha iyi – dman

2

ÇOK geç cevap için üzgünüm ama gerçekten yapıcı içerisinde prototip eklemek VE değil, yeni örneği oluşturulduğunda bunun yeniden yapmak istiyorsanız, bunu yapabilirsiniz: Muhtemelen hala

function Dog() { 
    if (!Dog.prototype.bark) { 
     Dog.prototype = function() { 
      console.log('woof'); 
     } 
    } 

    this.bark(); 
} 

Bu yöntemi kullanmaz, ancak bu yöntemin 3. taraf çerçeveleriyle (tehlikeli bir tür) ilgilenirken bir seçenek olduğu bazı örneklere sahibim.