'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
Ö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:
- What does it mean that JavaScript is a prototypal language?
- What is the scope of a function in JavaScript?
- How does the "this" keyword work?
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.
Javascript mirası: süper kurucusunu ça...
Nasıl JavaScript yok .prototip çalışma...
JavaScript: Sınıf.yöntem vs Sınıf.prot...
Nasıl Javascript bir değişkeni kullanm...
Seçeneğini kullanarak bir WordPress ku...