我刚刚开始使用原型 JavaScript,并且在解决如何在作用域发生变化时从原型函数内部保留对主对象的 this
引用方面遇到了麻烦。让我举例说明我的意思(我在这里使用 jQuery) :
MyClass = function() {
this.element = $('#element');
this.myValue = 'something';
// some more code
}
MyClass.prototype.myfunc = function() {
// at this point, "this" refers to the instance of MyClass
this.element.click(function() {
// at this point, "this" refers to the DOM element
// but what if I want to access the original "this.myValue"?
});
}
new MyClass();
我知道我可以通过在 myfunc
的开头这样做来保留对主对象的引用:
var myThis = this;
然后使用 myThis.myValue
访问主对象的属性。但是当我在 MyClass
上有一大堆原型函数时会发生什么呢?我必须在每一个的开头保存对 this
的引用吗?看来应该有更干净的办法。那像这样的情况呢:
MyClass = function() {
this.elements $('.elements');
this.myValue = 'something';
this.elements.each(this.doSomething);
}
MyClass.prototype.doSomething = function() {
// operate on the element
}
new MyClass();
在这种情况下,我不能用 var myThis = this;
创建对主对象的引用,因为在 doSomething
的上下文中,甚至 this
的原始值也是 jQuery
对象,而不是 MyClass
对象。
有人建议我使用一个全局变量来保存对原始 this
的引用,但对我来说这似乎是一个非常糟糕的主意。我不想污染全局名称空间,这似乎会阻止我实例化两个不同的 MyClass
对象,而不让它们相互干扰。
有什么建议吗? 有没有一个干净的方法来做我想要做的事情? 或者我的整个设计模式有缺陷吗?