この質問は、JavaScript で「プライベート」インスタンス変数を持つ機能に関して解決しようとしていた問題から生じています。私の質問の前に、これを読みたいと思うかもしれません。
完全を期すために、質問をする前に、問題全体を説明しました。これが JavaScript でインスタンス メンバーとメソッドを正しく実装する方法の完全な例を提供し、ここにたどり着いたすべての開発者がさまざまな実装の落とし穴を理解できるようになることを願っています。
次の JavaScript オブジェクトを検討してください。
var MessageBox = (function() {
function MessageBox(message) {
this.message = message;
}
MessageBox.prototype.Show = function() {
alert(this.message);
}
})();
このオブジェクトは TypeScript を使用してモデル化されており、次のように使用できます。
var msg1 = new MessageBox("Hello World");
msg1.Show(); // alerts "Hello World"
var msg2 = new MessageBox("Bye World");
msg2.Show(); // alerts "Bye World"
しかし、私はまだ呼び出すことができます:
msg1.message; // "Hello World"
msg2.message; // "Bye World"
だから明らかにthis.message
プライベートではありません。
次に、次の JavaScript オブジェクトについて考えてみましょう。
var MessageBox = (function() {
return function MessageBox(message) {
var message = message;
MessageBox.prototype.Show = function() {
alert(message);
}
}
})();
MessageBox
これは、TypeScript ベースのオブジェクトの単なる修正版です。
var msg1 = new MessageBox("Hello World");
msg1.Show(); // alerts "Hello World"
var msg2 = new MessageBox("Bye World");
msg2.Show(); // alerts "Bye World"
しかし、待ってください...私は作品にスパナを投げようとしています!
var msg1 = new MessageBox("Hello World");
var msg2 = new MessageBox("Bye World");
msg2.Show(); // alerts "Bye World"
msg1.Show(); // alerts "Bye World" ... wait, what!?
msg1.message // undefined
msg2.message // undefined
そのため、メッセージ変数にアクセスできなくなりましたが、新しいインスタンスごとに最後のインスタンス メッセージが上書きされます。
これは考慮すべき最後の JavaScript オブジェクトです。
var MessageBox = (function() {
return function MessageBox(message) {
var message = message;
this.Show = function() {
alert(message);
}
}
}();
上記のオブジェクトは、プロトタイプに Show() を実装しなくなったため、次のことができるようになりました。
var msg1 = new MessageBox("Hello World");
var msg2 = new MessageBox("Bye World");
msg2.Show(); // alerts "Bye World"
msg1.Show(); // alerts "Hello World"
msg1.message // undefined
msg2.message // undefined
すごい!これで、プライベート変数ができました。それらは互いに上書きしません!
それで、最後に質問:次の違いは何ですか:
MessageBox.prototype.Show = function() {
}
と
this.Show = function() {
}