1. ホーム
  2. javascript

[解決済み] プロトタイプ定義関数からプライベートメンバー変数にアクセスする

2022-04-23 18:16:34

質問

コンストラクタで定義された「プライベート」変数を、プロトタイプで定義されたメソッドで使用できるようにする方法はありますか?

TestClass = function(){
    var privateField = "hello";
    this.nonProtoHello = function(){alert(privateField)};
};
TestClass.prototype.prototypeHello = function(){alert(privateField)};

これは有効です。

t.nonProtoHello()

しかし、これでは

t.prototypeHello()

私はこれまでコンストラクタの内部でメソッドを定義してきましたが、いくつかの理由から、この方法から脱却しつつあります。

どのように解決するのか?

いいえ、そんな方法はありません。 それは本質的にスコープを逆にしていることになります。

コンストラクタの内部で定義されたメソッドは、プライベート変数にアクセスすることができます。

プロトタイプ上で定義されたメソッドは、コンストラクタのスコープ内で定義されていないため、コンストラクタのローカル変数にアクセスすることはできません。

プライベート変数を持つことはできますが、プロトタイプ上で定義されたメソッドにアクセスさせたい場合は、ゲッターとセッターを this オブジェクトを作成し、プロトタイプのメソッドは (他のすべてと一緒に) にアクセスすることができます。例えば

function Person(name, secret) {
    // public
    this.name = name;

    // private
    var secret = secret;

    // public methods have access to private members
    this.setSecret = function(s) {
        secret = s;
    }

    this.getSecret = function() {
        return secret;
    }
}

// Must use getters/setters 
Person.prototype.spillSecret = function() { alert(this.getSecret()); };