7

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++ など) のように、クラスのようなシミュレーションを実現するにはどうすればよいですか?

ありがとう、デビッド・シュライバー

4

5 に答える 5

13

Douglas Crockfords パワー コンストラクター パターン(リンクはビデオへのリンク) を使用すると、次のような保護された変数を実現できます。

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();ください。

于 2009-11-28T22:52:47.837 に答える
2

先頭のアンダースコアのような何らかのマークアップでプライベート変数をマークします_ これにより、それがプライベート変数であることがわかります (ただし、技術的にはそうではありません)。

this._privateProperty = "private";
alert( this._privateProperty )
于 2009-11-28T22:31:12.687 に答える
0

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

SubClass.prototype.privateProperty  = undefined;

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

于 2009-11-28T17:27:27.720 に答える
0

これは不可能です。そして、それは実際にはプライベート プロパティではありません。定義されたスコープ内でのみ使用できる通常の変数です。

于 2009-11-28T17:23:57.570 に答える