1

こんな素朴な質問ですみません。

メソッドを介して内部変数を取得したい.Javaでは、以下のコードで実現できます。

class MyClass{
    String words = "hello";     
    MyClass(){
        // constructor
    }
    String getWords(){
        return this.words;
    }
}

次に、メソッドを呼び出して単語 (内部変数) を取得できます getWords()

MyClass myClass = new MyClass(); // object instance
System.out.println(myClass.getWords()); // get the words

私の質問は、どうすればJavaScriptでそのようなことを達成できるかです。

4

2 に答える 2

4

インスタンスwordsメンバーはパッケージ プライベートです。公開ではありませんが、非公開でもありません。同じパッケージ内の他のクラスはアクセスできます。これを JavaScript で実現するのは困難です。

プライベートにしたい場合、JavaScript での古典的なパターンは次のようになります。

function MyClass() {
    var words = "hello";
    this.getWords = function() {
        return words;
    };
}

var instance = new MyClass();
console.log(instance.getWords());

によって作成されたすべてのオブジェクトnew MyClassは、関数の独自のコピーを取得することに注意してくださいgetWordswordsコンストラクター内の単なる変数です。関数はgetWordsそれを閉じます。Crockford は、彼の記事Private Members in JavaScriptでこれについて説明しています。

パッケージ プライベートに近いもの、またはインスタンスごとにその関数を再作成することを避けるために、ES6 用に計画されているパターンが必要です。これは、ES5 (または ES3) でほぼ実装できるパターンです。

var MyClass;
var AnotherPackageClass;
(function() {
    // Everything within this scoping function is the "package"

    var wordsKey = new Name(); // ES6, but see article below for an ES3/ES5 option

    MyClass = function() {
        this[wordsKey] = "hello";
    };
    MyClass.prototype.getWords = function() {
        return this[wordsKey];
    };

    AnotherPackageClass = function() {
    };
    AnotherPackageClass.prototype.getWordsFrom(o) {
        return p[wordsKey];
    };
))();

new Name呼び出しに注意してください。ES6 では、これによりprivate name objectと呼ばれるものが作成されます。これは文字列ではありませんが、プロパティにアクセスするために使用できます。プロパティには名前がないため、キーがないとアクセスできません。これにより、真のプライベートプロパティを作成できます。

このパターンと、ES5 (さらには ES3) でこのパターンに非常に近づける方法については、次の記事で説明します: ES6 のプライベート プロパティ、ES3、および ES5

上記の両方のパターンは、さまざまな方法でクロージャーに依存しています。それらについての私の記事は、あなたになじみがない場合に役立つかもしれません: Closures are not complex

于 2013-08-22T08:26:30.993 に答える