2009-11-28 7 views
5

プライベートメンバーを基底クラスからサブクラスに継承する方法はJavaScriptにありますか?JavaScriptでプライベートメンバーを継承する方法は?

私はこのような何かを達成したい:

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 
} 

どのように私は他のOOP-の言語私がプライベート(保護)プロパティを継承することができます(例えばC++)のように、クラスのようなシミュレーションを、達成することができますか?

はこれが不可能な、 デビッド・シュライバー

+0

このパターンはプライベートプロパティを追加しません。これは、BaseClass関数にprivatePropertyというローカル変数を追加するだけです。 – erikkallen

+1

http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592このような言語の虐殺に関する私の意見は、 C++をエミュレートしようとするのではなく、JSのセマンティクスを学ぶ – Christoph

答えて

11

であなたのプライベート変数ビデオは)、あなたはこのように保護された変数を達成することができます

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; 
} 

注:電源コンストラクタパターンを使用すると、newを使用しないでください。代わりに、ちょうどvar new_object = subclass();と言う。

+0

ありがとう!パワーコンストラクタのパターンビデオへのリンクは私を非常に助けてくれました。これはまさに私が探していたものでした。今私は、JSとオブジェクトについて学ぶことが私にとってはるかに多くあることを理解しています:-) –

+1

リンクが変更されました。 http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (元のリンクはパート1になりました) –

+1

「secret.privateProperty」はそうではないはずです'secret.protectedProperty'そしてprivateは' var privateProperty'のようなものでしょうか? – sabgenton

0

、ありがとうございました。これは実際に私有財産ではなく、定義されている範囲でのみ利用可能な単なる普通の変数です。

行うことはできませんが、それが継承されないように、あなたはクラスのプロトタイプからプロパティを削除することができ
0

SubClass.prototype.privateProperty = undefined; 

それが継承されることはありませんその方法が、あなたはそれを行う必要があります基本クラスのすべての「プライベート」プロパティに対して

2

マーク先頭にアンダースコアのようなマークアップのいくつかの種類_ にあるDouglas Crockfords power constructor pattern(リンクを使用する(技術的にそれはないですが)あなたはそれがプライベート変数であることを知っているこの方法で

this._privateProperty = "private"; 
alert(this._privateProperty) 
関連する問題