当原型包含一个对象时,访问“this”值?

时间:2015-06-26 13:13:02

标签: javascript object prototype

我有一个像这样的

 function Foo() {
   this._current = -1;
 }
 Foo.prototype.history = {};
 Foo.prototype.history.back = function () {
   if (this._current === undefined) {
     return alert("this._current is undefined");
   }
   --this._current; // `this` is the history object
 };

如何在Foo方法中访问back个实例?

我解决方案我看到的是做这样的事情:

var f = new Foo();
f.history.back = f.history.back.bind(f);

是否有更好的解决方案?为每个Foo实例执行此操作对我来说听起来不太好。

以下是一个例子:



function Foo() {
  this._current = -1;
}
Foo.prototype.history = {};
Foo.prototype.history.back = function() {
  if (this._current === undefined) {
    return alert("this._current is undefined");
  }
  --this._current; // `this` is the history object
};

var f = new Foo();
f.history.back();




我知道它应该是这样,但是解决这类问题的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

代码中的基本问题是,history的所有实例之间只共享一个Foo对象。您必须为每个实例设置一个history。解决方案是:

function FooHistory(foo){
	this._foo = foo;
}
FooHistory.prototype.back = function() {
  if (this._foo._current === undefined) {
    return alert("this._foo._current is undefined");
  }
  this._foo._current--; 
};

function Foo() {
	this._current = -1;
	this.history = new FooHistory(this);
}
var f = new Foo();
f.history.back();

(您可能希望在_current实例中使用FooHistory而不是Foo实例,我尝试尽可能少地更改代码。

请注意,其他解决方案也是可行的,具体取决于较大的视图。如果您没有任何状态存储在历史记录对象中,那么您还可以Foo.prototype.history()返回一个对象,该对象具有链接回Foo实例的属性。然后你会打电话给f.history().back()