类似行为的Javascript

时间:2014-01-31 10:23:17

标签: javascript class

所以我有这个Javascript函数(类):

function Test() {
    this.a = function() { return 'hello'; }
    this.b = function() { alert(this.a()); }
    window.onload = this.b;
}
test = new Test();

代码不起作用,因为窗口加载的this.b函数变成了一个全局函数(在Test函数/类之外),其中this.a不存在。

这样的事情:

function Test() {
    this.a = function() { return 'hello'; }
    this.b = function() { alert(test.a()); } // changed this to test
    window.onload = this.b;
}
test = new Test();

确实有效,但它假设我知道哪个变量包含Test函数/类,这会失去创建多个类的功能。

维护这种方法的最佳解决方案是什么(在函数/类中使用这个指针)并得到想要的结果?

3 个答案:

答案 0 :(得分:5)

实际上,它与范围无关,与上下文无关。

请参阅,当调用事件处理程序时,this设置为事件绑定的任何元素。在这种情况下,thiswindow

尝试这样的事情:

function Test() {
    var self = this;
    self.a = function() {return 'hello';};
    self.b = function() {alert(self.a());};
    window.onload = self.b;
}

通过将上下文“保存”到变量self,可以避免上下文问题。

答案 1 :(得分:3)

代码中的

this指的是本地函数function() { alert(this.a()); },如果你想引用“类范围”,你必须在该类中存储一个refence:

function Test() {
    var localTest = this;
    this.a = function() { return 'hello'; }
    this.b = function() { alert(localTest.a()); }
    window.onload = this.b;
}
test = new Test();

答案 2 :(得分:3)

尝试

window.onload = this.b.bind(this)

当您在javascript中编写someObj.func时,结果参考不知道someObj。因此,如果您需要this中的正确func,则必须明确提供。

这可以通过关闭this的父作用域中的func来完成,正如其他答案所示,但我认为bind更透明。