2012-05-02 14 views
18

olarak kullanan bir Javascript İşlev İfadesini düşünmek doğru, sadece Javascript'i biraz daha derinden anlamaya çalışıyorum.'Yeni' anahtar kelimesini 'statik'

Sadece bir tanesini istemediğim, yapıcıya ihtiyaç duymadığım veya örneklenemediğim bir 'sınıf' gameData oluşturdum.

yüzden 'yeni' anahtar kelime Bu örneği izin ve kullanılabilir GİBİ statik sınıf C# olacağını yapar olmadığını fark

var gameData = new function() { 

    //May need this later 
    this.init = function() { 
    }; 

    this.storageAvailable = function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    }; 
} 

... şöyle yarattı.

Bunu doğru olarak düşünüyor muyum? Statik olarak mı?

+3

Yalnızca tek bir nesne örneğine ihtiyacınız varsa, neden bir kurucu kullanırsınız? – RobG

+0

Sorunuzu anladığımdan emin değilim. Temel ve nesnel özellikler ve yöntemlere sahip olabilmem için temel bir nesneye karşı bu şekilde yarattım. –

+0

İlgili: http://stackoverflow.com/questions/17008086/no-ways-to-have-class-based-objects-in-javascript/17008693#17008693 –

cevap

22

Hayır, statik değildir. senin örnekte, ikinci bir nesne reinstantiate için

var gameData2 = new (gameData.constructor)(); 

kullanabilirsiniz, böylece "sınıfı" (aslında örneği) gerçekten "statik" değildir. Temel olarak yapıcıyı ve muhtemelen ona bağlı verileri sızdırıyorsunuz. Ayrıca, bir işe yaramaz prototip nesnesi (gameData.constructor.prototype) oluşturulur ve gameData prototip zincirine eklenir, ne istediğinizi değil.

Bunun yerine,

  • (Daff's answer olduğu gibi) değişmez tek ve basit bir nesne kullanabilirsiniz. Yani, bir kurucunuz yok, kapatma kapsamı olmayan özel değişkenler (yine de hiç kullanmadınız) ve hiçbir (özel) prototipiniz yok.
  • (açıklayıcı) modül kalıbı (jAndy's answer'da olduğu gibi). Kapatma kapsamındaki değişkenler oluşturmak için IIFE kodunuz var ve her türlü nesneyi döndürebilirsiniz.
  • daha sonra (gerektiğinde) başlatılabilen ve her zaman aynı tekil nesneyi veren bir gerçek kurucu ("sınıf"). Eğer GameData yalnızca bir örneğini çünkü

    function GameData() { 
        if (this.constructor.singleton) 
         return this.constructor.singleton; 
        else 
         this.constructor.singleton = this; 
    
        // init: 
        // * private vars 
        // * public properties 
        // ... 
    } 
    GameData.prototype.storageAvailable = function() { 
        if (typeof (Storage) !== "undefined") { 
         return true; 
        } 
        else { 
         return false; 
        } 
    }; 
    
    var gameData = new GameData(); 
    var gameData2 = new GameData(); 
    gameData === gameData2 === GameData.singleton; // true 
    

    Ancak prototip oldukça işe yaramaz:

Bu gibi tek adet desen bakmak olacaktınız. Sadece miras ile ilginç olur.

12

sadece Nesne yoktur, ECMAScript'te hiçbir Sınıf yoktur. Bir işlevi çağırmak için new kullanıldığında, yapıcı işlevi olarak adlandırılır. Bu işlev, bir kez bittiğinde otomatik olarak yeni bir nesne döndürür. Bu nesne içinde depolanan this (yeni oluşturulan nesnenin başvurduğu) kullanılarak döndürülen veriler, o nesnenin özelliği olarak döndürülür. Bunun yanında, new tam olarak bu işlev için yapıcı adlı bir özellik ayarlar.

var gameData = (function() { 
    var public = { }, 
     private = { }; // any private data can get stored here 

    //May need this later 
    public.init = function() { 
    }; 

    public.storageAvailable = function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    }; 

    return public; 
}()); 

Bu fabrika deseni, tekil desen denir: aşağıdaki gibi durumda

, hatta gerçekten new kullanımını gerektirmeyen, kolayca kodunuzu yeniden yazabilirsiniz, modül modeli ve başka adlar da olabilir.

var gameData = { 
    //May need this later 
    init : function() { 
    }, 

    storageAvailable : function() { 
     if (typeof (Storage) !== "undefined") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

Eğer özel değişkenleri kullanmak istiyorsanız

bir açıklayıcı modül desen tarzı sarmalayıcı oluşturmak:

+0

Teşekkürler! Bu çok ilginç görünüyor .. ve benim için denemek ve sindirmek için daha fazla bir şey! :) –

+1

, buna "kendinden uyarılmış bir anonim fabrika" demelisiniz. – Bergi

+2

@toddv: Çok iyi bir öneri ve tavsiyemiz, Douglas Crockford'un ECMAscript mirasına, Objects + prototiplerine girmesi için "JavaScript: The Good parts" (İyi JavaScript). – jAndy

6

Ne arıyorsun sadece basit bir JavaScript nesnesidir düşünüyorum. Bu JANDY önerdi temelde şudur: hala "anonim" işlevine işaret eden bir constructor özelliği vardır çünkü

var gameData = (function() { 
    var private = 'private variable'; 

    return { 
     //May need this later 
     init : function() { 
     }, 

     storageAvailable : function() { 
      if (typeof (Storage) !== "undefined") { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
})(); 
+0

Bu rotaya gitmedim çünkü kamuya ve özel yöntemlere ve yapıcılara sahip olmak istedim .. . ve bu nesne değişmezlerini kullanarak gerçekleştirilemez ... doğru mu? –

+2

Özel değişkenler için cevabımı güncelledim. Statik bir sınıf için neden bir kurucuya ihtiyacın olduğunu anlamıyorum. – Daff

İlgili konular