我刚开始使用原型JavaScript,并且无法在范围更改时从原型函数内部保留对主对象的引用this
。让我来说明我的意思(我使用jQuery在这里):在JavaScript原型函数中保留对“this”的引用
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;
主要对象的引用,因为this
的doSomething
范围内,即使原来的值是jQuery
对象,而不是一个MyClass
对象。
有人建议我使用全局变量来保存对原始this
的引用,但对我来说这似乎是一个非常糟糕的主意。我不想污染全局命名空间,这似乎会阻止我实例化两个不同的对象,而不会相互干扰。
有什么建议吗?有没有干净的方式来做我以后的事情?或者是我的整个设计模式有缺陷?
我真的很喜欢这个功能,但是在jQuery环境中,我倾向于在给定现有jQuery.bind方法的情况下命名它(即使没有实际的命名冲突)。 –
@Rob,创建一个与'Function.prototype.bind'相同的'jQuery.bind'方法是很简单的,检查这个简单的实现:http://jsbin.com/aqavo/edit虽然我会考虑更改它的名字,它可能会导致与事件/绑定方法混淆... – CMS
我强烈建议坚持使用名称'Function.prototype.bind'。它现在是语言的标准化部分;它不会消失。 – bobince