考虑一下:
var Foo = function Foo () {
var numberVar = 0;
fooPrototype = {
getNumberVar: function () {
return numberVar;
},
setNumberVar: function (val) {
this.numberVar = val;
}
}
return fooPrototype;
};
var foo = new Foo();
或者,看看这个:
var Bar = function Bar() {
var numberVar = 0;
};
Bar.prototype = {
getNumber: function () {
return this.numberVar;
},
setNumber: function (val) {
this.numberVar = val;
}
};
var bar = new Bar();
他们都做同样的事情,因为他们允许公共/私人成员。 这样或那样做有什么好处吗?
答案 0 :(得分:1)
这里的逻辑基于错误的假设。在第二个实现中,从不使用构造函数变量numberVar
。您没有可以访问它的代码,因此您没有在第二个代码块中使用私有变量。
第二个实现中的方法是访问名为numberVar
的对象属性,该属性可作为对象上的属性公开访问,该属性与构造函数中同名的局部变量不同。您不能在第二个实现中拥有私有变量,因为原型声明的方法未在私有范围中声明。
这是你的第二个代码块中发生的事情:
var Bar = function Bar() {
// this variable is never used as there is no code in this scope
// that can reach this variable. In fact, it is garbage collected
// immediately
var numberVar = 0;
};
Bar.prototype = {
getNumber: function () {
return this.numberVar;
},
setNumber: function (val) {
// sets a public property on the object
this.numberVar = val;
}
};
var bar = new Bar();
bar.setNumber(10);
console.log(bar.numberVar); // 10, this property is public
有关构造函数与原型定义方法中声明的方法的一般讨论,请参阅此讨论:
Advantages of using prototype, vs defining methods straight in the constructor?