我有这个:
var Foo = function( v )
{
/* Private member for shorthand prototyping */
var _prototype = Foo.prototype;
/* Private member */
var _v = null;
/* Public getter */
_prototype.vGet = function( )
{
v = _v;
return v;
};
/* Private setter */
var vSet = function( v )
{
_v = v;
};
/* Constructor closure */
( function( v )
{
vSet( v );
} )( v );
};
var f1 = new Foo( 10 );
console.log( 'f1::' + f1.vGet( ) ); /* f1::10 */
var f2 = new Foo( 20 );
console.log( 'f2::' + f2.vGet( ) ); /* f2::20 */
console.log( 'f1::' + f1.vGet( ) ); /* f1::20 */
所以我的问题很明显。在f2
中创建Foo
的第二个实例后,f1._v
也发生了变化。
我选择这种带有私有setter的模式是为了防止在类本身之外对成员进行不必要的更改。
根据我对原型的了解,这种行为不应该发生。但是很明显,我的私有成员被几个实例唯一地使用。我误解了什么?
您的问题是每次构建Foo
的新实例时都重新定义了Foo.prototype.vGet
。原型在Foo
的所有实例之间共享,但是您重新定义的vGet
函数包含对Foo
的最后构造实例的_v
变量的引用。
解决方案是将Foo.prototype.vGet = ...
更改为Foo.vGet
,从而每次都创建一个新函数。或者将赋值移到构造函数之外,例如使用this._v
而不是_v
,这会削弱您的封装。