私有成员被另一个实例覆盖



我有这个:

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,这会削弱您的封装。

最新更新