2009-11-28 32 views
5

Özel üyeler bir alt sınıftan bir alt sınıfa devralmak için JavaScript'te bir yol var mı?JavaScript'te özel bir üye nasıl alınır?

Böyle bir şey başarmak istiyorum:

function BaseClass() { 
    var privateProperty = "private"; 

    this.publicProperty = "public"; 
} 

SubClass.prototype = new BaseClass(); 
SubClass.prototype.constructor = SubClass; 

function SubClass() { 
    alert(this.publicProperty); // This works perfectly well 

    alert(this.privateProperty); // This doesn't work, because the property is not inherited 
} 

nasıl diğer oop-dillere Ben özel (korumalı) özelliklerini devralabilir (örneğin C++.) Gibi bir sınıf benzeri simülasyon, elde edebilirsiniz?

Bu mümkün değildir, David Schreiber

+0

Bu kalıp özel bir özellik eklemez. Yalnızca BaseClass işlevinde privateProperty adlı yerel bir değişken ekler. – erikkallen

+1

http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 bu tür dil piçleri hakkında görüşüme bakınız; JS'nin semantiğini öğrenmek yerine C++ – Christoph

cevap

11

ile özel değişkenleri bir video), bu gibi korunan değişkenleri elde edebilirsiniz:

function baseclass(secret) { 
    secret = secret || {}; 
    secret.privateProperty = "private"; 
    return { 
     publicProperty: "public" 
    }; 
} 

function subclass() { 
    var secret = {}, self = baseclass(secret); 
    alert(self.publicProperty); 
    alert(secret.privateProperty); 
    return self; 
} 

not: güç yapıcı deseni ile, new kullanmayın. Bunun yerine, sadece var new_object = subclass(); deyin.

+0

öykünmeyi denemeye çalışın Çok teşekkür ederim! Güç yapıcı model videonun bağlantısı bana çok yardımcı oldu. Tam olarak aradığım şey buydu. Şimdi anladığım kadarıyla JS ve nesneler hakkında daha fazla bilgi sahibi olacağım :-) –

+1

Link değişti; İşte yeni bir tane: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (Orijinal bağlantı bölüm 1 idi) –

+1

Yapmamalıyız secret.privateProperty' 'secret.protectedProperty' ve daha sonra özel 'var privateProperty' gibi bir şey olurdu? – sabgenton

0

teşekkür ederiz. Ve bu gerçekten özel bir mülk değil - sadece tanımlandığı kapsamda mevcut olan normal bir değişken.

yapılamaz
0

, ancak miras değil, böylece sınıf prototip gelen özelliği silme olabilir:

SubClass.prototype.privateProperty = undefined; 

o miras olmayacak Böylece, ama bunu yapmak gerekir Temel sınıfınızdaki her "özel" özellik için.

2

Mark lider çizgi gibi biçimlendirme çeşit _ etmektir Douglas Crockfords power constructor pattern (bağlantıyı kullanarak (teknik olarak olmasa da) bunun özel bir değişken olduğunu biliyorum Bu şekilde

this._privateProperty = "private"; 
alert(this._privateProperty) 
İlgili konular