2009-10-28 17 views
427

Aşağıdaki iki bildirim arasındaki fark nedir?JavaScript: Class.method vs. Class.prototype.method

Class.method = function() { /* code */ } 
Class.prototype.method = function() { /* code using this.values */ } 

statik yöntemin bir bildiri ve bir örnek yönteminin bir deklarasyon olarak ikinci ifadesi olarak ilk açıklamada düşünmek iyi mi?

cevap

630

Evet, ilk işlevin constructor function nesnesinin bir örneğiyle hiçbir ilişkisi olmadığından, 'statik yöntem' gibi düşünebilirsiniz. JavaScript işlevlerine de

Bunu mu sadece herhangi bir nesne gibi onları tedavi edebilir, bu durumda, sadece işlev nesnesine bir özellik ekliyoruz demektir first-class nesnelerdir. Eğer yapıcı işlevi prototip uzanan gibi

İkinci fonksiyon, bu new anahtar kelime ile oluşturulan tüm nesne örneklerine sunulacak ve bu işlevin (this anahtar kelime) içinde bağlam gerçek nesne örneğini ifade edecektir Nerede diyorsun? Eğer hala sadece bellekte publicMethod yalnızca bir örneğini olacak ama privilegedMethod durumunda size örneği çok sayıda oluşturarak sona erecek, sen Sınıfım birden fazla örneği oluşturmak

// constructor function 
function MyClass() { 
    var privateVariable; // private member only available within the constructor fn 

    this.privilegedMethod = function() { // it can access private members 
    //.. 
    }; 
} 

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance 
MyClass.staticMethod = function() {}; 

MyClass.prototype.publicMethod = function() { 
    // the 'this' keyword refers to the object instance 
    // you can access only 'privileged' and 'public' members 
}; 

var myObj = new MyClass(); // new object instance 

myObj.publicMethod(); 
MyClass.staticMethod(); 
+53

ile bölüm yorumladı: http://code.google.com/intl/es/speed/articles/optimizing-javascript.html Bunu söylemek de önemlidir 'MyClass'ın birçok örneğini oluşturuyorsak, her bir örnek için' privilegedMethod 'fonksiyonunu yaratıyoruz. Ancak 'publicMethod', oluşturulan tüm örnekler için yalnızca bir kez oluşturulur. – Menda

+13

Burada Menda'nın yorumunda bahsedilen makaleyle ilgili güncel bir bağlantı var: https://developers.google.com/speed/articles/optimizing-javascript –

+1

Neden Function.prototype.method == Function.method? – Raghavendra

15

:

bu örneği düşünün ve staticMethod bir nesne örneği ile hiçbir ilişkisi yoktur.

Bu nedenle prototipler bellek tasarrufu sağlar.

Ayrıca, üst nesnenin özelliklerini değiştirirseniz, çocuğun ilgili özelliği değiştirilmediyse, güncellenir. .prototype ilave edilmesi durumunda, .prototype

aynı kod ile
ExampleClass = function(){}; 
ExampleClass.method = function(customString){ 
      console.log((customString !== undefined)? 
          customString : 
          "called from func def.");} 
ExampleClass.method(); // >> output: `called from func def.` 

var someInstance = new ExampleClass(); 
someInstance.method('Called from instance'); 
    // >> error! `someInstance.method is not a function` 

olmadan çalışmasını tanımlarken görsel öğrenciler için

5

,

ExampleClass.prototype.method = function(customString){ 
      console.log((customString !== undefined)? 
          customString : 
          "called from func def.");} 
ExampleClass.method(); 
     // > error! `ExampleClass.method is not a function.` 

var someInstance = new ExampleClass(); 
someInstance.method('Called from instance'); 
       // > output: `Called from instance` 

yapmak için I açık t,

ExampleClass = function(){}; 
ExampleClass.directM = function(){} //M for method 
ExampleClass.prototype.protoM = function(){} 

var instanceOfExample = new ExampleClass(); 

ExampleClass.directM();  ✓ works 
instanceOfExample.directM(); x Error! 

ExampleClass.protoM();  x Error! 
instanceOfExample.protoM(); ✓ works 

**** yukarıdaki örnek için someInstance.method() Not
ExampleClass.method olarak icra edilmez() hata & yürütme devam edemez neden olur.
Ama illüstrasyon & kolay anlaşılması açısından, bu diziyi tuttuk. **** adım kodu ile yukarıdaki jsbin linke chrome developer console & JS Bin
tıklayın üretilen

Sonuçları.
Geçiş Bu çekildi ctrl + /