2012-04-16 31 views
1

我是Javascript新手,刚刚发现了用于定义对象函数的property关键字。我试图使用对象重构我的websocket实验,但我无法让它工作。如何在javascript中分配函数?

此作品(无对象):

var ws = new WebSocket(something, somethingelse); 
ws.onopen = function() { 
    ws.send("hello"); 
    console.log("works"); 
} 

但这并不:

function MyObject() { 
    this.ws = new WebSocket(something, somethingelse); 
    this.ws.onopen = this.onOpen; 
} 

MyObject.prototype.onOpen = function() { 
    this.ws.send("hello"); // undefined! 
}; 

为什么WS不确定?我是否错误地分配onOpen功能?

+2

你使用'new'关键字吗?这里有一些错误的东西;你究竟想要做什么? – 2012-04-16 14:19:27

+1

什么是“属性关键字?” – 2012-04-16 14:24:41

+0

onOpen函数将被WebSocket对象调用,而“this”实际上是WebSocket对象而不是MyObject。 (*如果我不是在乱搞东西.. *) – moka 2012-04-16 14:57:20

回答

6

您正在分配函数(只有一种分配函数的方法),问题是函数的上下文发生变化。

考虑这条线:

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.onOpenthisthis.wsWebSocket实例,它不具有ws财产,而不是MyObject实例。

这可以通过两种方式解决:

  1. 由于this已经指this.ws,你可以this直接调用send

    MyObject.prototype.onOpen = function() { 
        this.send("hello"); 
    }; 
    
  2. 如果你想thisMyObject.prototype.onOpen总是参考MyObject实例,您必须保持对实例的明确引用,例如通过关闭:

    var self = this; 
    this.ws.onopen = function() { 
        self.onOpen(); 
    }; 
    

    现在里面onOpenthis是指有一个属性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"); 
} 

可能也会起作用。

+0

是的,当我使用WebSockets的时候,我做了一些与此类似的事情。 – 2012-04-16 14:28:32

+0

啊,是最被人误解的JavaScript“功能”之一。 'this'关键字。 – 2012-04-16 14:28:53

+0

感谢您的出色解释! – wannabeartist 2012-04-16 18:14:32

相关问题