'prototip' vs '' JavaScript kullanmak? | Netgez.com
SORU
22 Kasım 2008, CUMARTESİ


'prototip' vs '' JavaScript kullanmak?

Arasında ne fark var

var A = function () {
    this.x = function () {
        //do something
    };
};

ve

var A = function () { };
A.prototype.x = function () {
    //do something
};

CEVAP
22 Kasım 2008, CUMARTESİ


Örnekler çok farklı sonuçlar var.

Farklılıklara bakmadan önce, aşağıdaki dikkat edilmelidir:

  • Privateprototipbir yol saÄŸlar örneÄŸinin özel) örnekleri arasında yöntem ve deÄŸerleri paylaÅŸmak için [[Prototype]] özelliÄŸi.
  • Bir fonksiyonubuiÅŸlev olarak adlandırılır nasıl ayarlanır veya kullanmakbaÄŸlama(burada tartışılan deÄŸil). Bir iÅŸlev bir nesne (myObj.method() vs.) daha sonra isebubu yöntem içinde nesneye baÅŸvuruyor. Neredebukullanımı ile çaÄŸrı ya da ayarlı deÄŸilbaÄŸlamabu genel nesne (bir tarayıcı penceresinde) ya da katı modda varsayılan olarak , tanımsız kalır.
  • JavaScript nesne yönelimli bir dildir, yani her ÅŸey bir Nesne, fonksiyonları da dahil olmak üzere.

İşte soru: parçacıkları

var A = function () {
    this.x = function () {
        //do something
    };
};

Bu durumda, değişken A bir fonksiyon için bir referans bir değer atanır. Bu işlev A() fonksiyonu kullanılarak çağrıldığındabubu genel nesne ve ifade için varsayılan çağrı tarafından belirlenen değil this.x etkili window.x. Sonuç sağ tarafta işlev ifadesine başvuru window.x atanmış.

Bu durumda:

var A = function () { };
A.prototype.x = function () {
    //do something
};

çok farklı bir şey oluşur. İlk satırdaki A değişken bir işlev için bir referans olarak atanmıştır. JavaScript, tüm fonksiyonları nesne varprototipvarsayılan olarak özellik böyle bir şey oluşturmak için ayrı bir kodA. prototipnesne.

İkinci satırdaA. prototip.xbir işlev için bir referans olarak atanmıştır. Bu bir oluştururxeğer bu özellik yok, ya da eğer varsa yeni bir değer atamak. İlk örnek ile farkı nesne olanxözellik ifade yer almaktadır.

Başka bir örnek aşağıdadır. İlki (ve hakkında sormak istedin ne olabilir) benzer bir şey

var A = new function () {
    this.x = function () {
        //do something
    };
};

Bu örnekte, new operatör işlevi yapıcı olarak adlandırılır, böylece fonksiyonun önce eklendi. new fonksiyonu ile aradıbuayarlanır başvuru başvuru için kurucu ortak olarak ayarlanmış yeni bir Nesneprototip. Atama deyiminde, x özelliği bu yeni bir nesne oluşturulacak. Ne zaman bir kurucu olarak, bir işlev verirbuvarsayılan olarak nesne, return this; ayrı bir açıklama ihtiyacı yoktur.

Bunu kontrol etmek içinBirbir vardırxözellik:

console.log(A.x) // function () {
                 //   //do something
                 // };

Bu nadir bir kullanımyenibaşvuru için tek yol bu yana kurucu)A. yapıcı. Yapacak çok daha yaygın olurdu:

var A = function () {
    this.x = function () {
        //do something
    };
};
var a = new A();

Benzer bir sonuca ulaşmak için başka bir yol hemen çağrılan işlev bir ifade kullanmak için:

var A = (function () {
    this.x = function () {
        //do something
    };
}());

Bu durumda, A sağ tarafta işlev çağrısının dönüş değeri atanır. Yine burada, bu yanabuçağrı kümesi değil, genel nesne referans ve this.x etkili window.x. İşlevin geri dönüş olmadığından herhangi bir şey, 33* *undefined değerine sahip olacaktır.

İki yaklaşım arasındaki bu farklılıklar da eğer seri ve de-seri JSON/Javascript nesneleri iseniz listesi. Yöntem tanımlanmış bir nesnenin prototip değil seri ne zaman seri hale nesne, uygun zaman için örnek istediğiniz için seri hale getirmek sadece veri bölümleri bir nesne değil, ama yöntem:

var A = function () { 
    this.objectsOwnProperties = "are serialized";
};
A.prototype.prototypeProperties = "are NOT serialized";
var instance = new A();
console.log(instance.prototypeProperties); // "are NOT serialized"
console.log(JSON.stringify(instance)); 
// {"objectsOwnProperties":"are serialized"} 

Ä°lgili sorular:

Not:İki yaklaşım arasında önemli bir hafıza tasarrufu olabilir, ancak yöntemleri ve özellikleri paylaşmak için prototip kullanarak olası her örneği kendi kopyasını sahip daha az bellek kullanır.

JavaScript düşük seviyeli bir dil değil. Açıkça bellek tahsis şeklini değiştirmek için bir yol olarak prototipleme veya diğer kalıtım şekilleri düşünmek için çok değerli olmayabilir.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • campos9896

    campos9896

    24 Mart 2012
  • Rozetked | Обзоры

    Rozetked | Ð

    5 AÄžUSTOS 2011
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012