您正在分配函数(只有一种分配函数的方法),问题是函数的上下文发生变化。
考虑这条线:
this.ws.onopen = this.onOpen;
可能性1:
现在假设,内WebSocket
,地方这个函数被调用,以开口连接的响应(如事件处理程序),可能就像
this.onopen();
What this
refers to inside a function is determined by how a function is called on run time(<-
阅读此链接,它有很大的帮助)。它在定义时间不受限制。在你的情况下,this
将参考WebSocket
实例。
所以里面好象叫这样,里面MyObject.prototype.onOpen
,this
指this.ws
的WebSocket
实例,它不具有ws
财产,而不是MyObject
实例。
这可以通过两种方式解决:
由于this
已经指this.ws
,你可以this
直接调用send
:
MyObject.prototype.onOpen = function() {
this.send("hello");
};
如果你想this
内MyObject.prototype.onOpen
总是参考MyObject
实例,您必须保持对实例的明确引用,例如通过关闭:
var self = this;
this.ws.onopen = function() {
self.onOpen();
};
现在里面onOpen
,this
是指有一个属性ws
,就像你设置它在构造函数中MyObject
实例。
在浏览器支持的ECMAScript 5,功能已经有该技术的方法,称为.bind()
:
this.ws.onopen = this.onOpen.bind(this);
可能性2:
它也可能是WebSocket
以这种方式拨打onopen
:
this.onopen.call(null);
在这种情况下,this
要么指window
或将undefined
,取决于代码是否严格模式运行或不(也没关系,在任何情况下这是一个问题)。
这种情况只能从第一种可能性的第二种解决方案中解决。
为什么第一个例子中的工作?
var ws = new WebSocket(something, somethingelse);
ws.onopen = function() {
ws.send("hello");
console.log("works");
}
在这种情况下,分配给ws.onopen
功能是关闭,关闭了在此范围内定义的变量,也ws
。从这个意义上说,它类似于解决问题的第二种方式,但是
ws.onopen = function() {
this.send("hello");
console.log("works");
}
可能也会起作用。
你使用'new'关键字吗?这里有一些错误的东西;你究竟想要做什么? – 2012-04-16 14:19:27
什么是“属性关键字?” – 2012-04-16 14:24:41
onOpen函数将被WebSocket对象调用,而“this”实际上是WebSocket对象而不是MyObject。 (*如果我不是在乱搞东西.. *) – moka 2012-04-16 14:57:20