2014-09-28 50 views
0

在Javascript中我已经定义的对象是这样的:在面向对象的Javascript传递对象构件的方法的事件处理程序

function myObject() { 
    this.x = 5; 
    window.addEventListener("resize", this.resizeHandler); 
} 

myObject.prototype.doSomething = function() { 
    alert(this.x); 
} 

myObject.prototype.resizeHandler = function() { 
    this.doSomething(); // Here occurs error. 
} 

var obj = new myObject(); 

但是我运行到错误消息“未捕获类型错误:未定义是不是一个函数” 。问题是“为什么?”解释会很棒!

在此先感谢。

+1

*“解释会很棒!”*解释是你传递函数而不是对象。函数本身就是对象,可以像任何其他对象一样传递和引用。正因为如此,您可以让多个对象引用相同的函数,或者没有引用它的对象。没有“所有者”对象这样的东西。因为函数中'this'的值通常是基于该函数的调用方式,所以需要以这种方式调用它,以便隐式或显式地“告诉”函数“this”值应该是什么。 – 2014-09-28 18:57:00

回答

4

你需要确保的this情况下是正确的......

function myObject() { 
    this.x = 5; 
    window.addEventListener("resize", this.resizeHandler.bind(this)); 
} 

myObject.prototype.doSomething = function() { 
    alert(this.x); 
} 

myObject.prototype.resizeHandler = function() { 
    this.doSomething(); // Here occurs error. 
} 

这里.bind(this)使用。

this更改用作事件处理函数的函数。

+1

小脚注:在IE <9中不支持#bind。可以在此处找到填充:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility – Bart 2014-09-28 18:53:28

+0

谢谢,这意味着要提及... :) – jcreamer898 2014-09-28 19:34:44

相关问题