方法在构造函数之前被调用

时间:2014-04-30 09:45:26

标签: javascript websocket

这是我的客户端websocket代码,它创建一个eventManager实例并调用一个方法。

var WebSocket = require('ws');
var eventManager = (function(){
    eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');

    //Constructor to initialize the connection.
    function eventManager(){
        //Open connection on send port.  
        this.wsConnection.on('open', function() {
            console.log('Connection opened');
        }); 
    }

    eventManager.prototype.sendMessage = function(message){
        console.log(message);
        this.wsConnection.send(message); //Send message to websocket server
    }

    return eventManager;
})();

//create instance
var eventManagerObj = new eventManager();
//call method
eventManagerObj.sendMessage("Hi to websockets");

当我创建实例并调用sendMessage方法时,似乎构造函数中的代码在方法调用之后执行。我希望构造函数中的代码首先执行以初始化连接而不是发送message.Any建议?

2 个答案:

答案 0 :(得分:0)

不太确定你的问题是什么,但它可能与进入函数执行上下文时发生的事情有关。

这里相关的事情是首先解析所有代码,然后实例化用 var 声明的所有变量(但不进行赋值),然后处理所有函数声明,然后执行代码开始。所以在函数表达式中:

var eventManager = (function(){

  eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');

  function eventManager(){
     ...
  }

函数声明表示在执行任何代码之前创建函数。创建函数时,默认情况下它具有 prototype 属性,因此在进行赋值之前, eventManager.prototype 位于上一行。

逻辑顺序就好像所有变量声明都被移动到函数的顶部,紧接着是所有函数声明,但是赋值保留在它们所在的位置。所以:

// do stuff
function x(){}
var a = 3;

处理为:

var a;
function x(){}
// do stuff
a = 3;

这也称为“吊装”,但这不是我喜欢的术语。

修改

OP中不需要IIFE。通常它们用于闭包并保护不应公开暴露的方法和变量,但OP不会将其用于此。所以它可以写成:

function eventManager() {
    //Open connection on send port.  
    this.wsConnection.on('open', function() {
        console.log('Connection opened');
    }); 
}

eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');

eventManager.prototype.sendMessage = function(message){
    console.log(message);
    this.wsConnection.send(message); //Send message to websocket server
}

//create instance
var eventManagerObj = new eventManager();
//call method
eventManagerObj.sendMessage("Hi to websockets");

它还以更接近于逻辑处理方式的顺序呈现代码。

答案 1 :(得分:0)

this.wsConnection.on('open', function() {
   console.log('Connection opened');

将在打开连接时记录。

eventManager.prototype.sendMessage = function(message){
    console.log(message);
    this.wsConnection.send(message); //

记录消息,然后打开一个触发wsConnection onOpen的连接,以便消息在" connection opened"之前记录。构造函数在sendMessage之前执行,但open事件在sendMessage中触发。

如果要证明构造函数代码在sendMessage之前执行,则可以添加另一个日志:

function eventManager(){
    console.log("adding event listener for wsConnection.open");
    //Open connection on send port.  
    this.wsConnection.on('open', function() {
        console.log('Connection opened');
    }); 
}