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

  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • LatinNinja99

    LatinNinja99

    28 EKİM 2011
  • STITCHLESS TV how to sew your own style tutorials

    STITCHLESS T

    9 HAZİRAN 2011