我有一个像这样的类:
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();

我知道它应该是这样,但是解决这类问题的正确方法是什么?
答案 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()
。