インスタンスwords
メンバーはパッケージ プライベートです。公開ではありませんが、非公開でもありません。同じパッケージ内の他のクラスはアクセスできます。これを JavaScript で実現するのは困難です。
プライベートにしたい場合、JavaScript での古典的なパターンは次のようになります。
function MyClass() {
var words = "hello";
this.getWords = function() {
return words;
};
}
var instance = new MyClass();
console.log(instance.getWords());
によって作成されたすべてのオブジェクトnew MyClass
は、関数の独自のコピーを取得することに注意してくださいgetWords
。words
コンストラクター内の単なる変数です。関数は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