这个问题源于我试图解决的关于在 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);
}
}
})();
这只是基于 TypeScript 的MessageBox
对象的修改版本。
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() {
}