如何在NodeJS中扩展事件的对象 - 文字对象?

时间:2012-05-31 16:04:01

标签: javascript events node.js object-literal eventemitter

我正在尝试使用 Node.js 对象投射事件。现在,如果我创建“静态”对象并实例化它们,这不是问题,但是当我的对象没有静态爷爷时,如何使用 object literal 表示法创建对象时,我该怎么做呢? / p>

我习惯编写ExtJS语法,所以我更喜欢对象文字中的所有内容。

// var EventEmitter = require('events').EventEmitter; // How where when?

myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  }
};

这是一个对象。它没有构造函数,因为不需要更多实例。

现在我如何允许myObject发出事件?

我已经尝试过并尝试调整代码,但如果不将我的对象重写为带有构造函数的表单,我就无法工作:

var EventEmitter = require('events').EventEmitter;
var util = require('util');

function myClass() {
  EventEmitter.call(this);

  myFunction: function() {
    this.emit('foo');
  },
  urFunction: function() {
    this.emit('bar');
  }
};

myClass.prototype = Object.create(EventEmitter.prototype);
// or // util.inherits(myClass, EventEmitter);
var myObject = new myClass; // Shouldn't be necessary for my single-instance case

或者将我的函数/原型添加到构造的内容中,如下所示:

var EventEmitter = require('events').EventEmitter;
var util = require('util');

var myObject = new EventEmitter();
// or // var myObject = Object.create(new EventEmitter); // Dunno difference
myObject.myFunction = function() {
    this.emit('foo');
  },
myObject.urFunction = function() {
    this.emit('bar');
  }
};

util.inherits(myObject, EventEmitter);

如何在保持对象文字符号的同时允许myObject发出事件? 如此多的令人困惑的方法,但不是那些JSON- 喜欢标记对象。

3 个答案:

答案 0 :(得分:9)

为什么不使用合成而不是继承?

var myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  },
  emitter: new EventEmitter()
}

答案 1 :(得分:8)

不幸的是,您无法实现所需的对象 - 文字语法。这是因为

var obj = {};

相当于

var obj = Object.create(Object.prototype);

obj的原型在创建时固定为Object.prototype,您无法在以后更改。

由于您只需要一个实例,我认为确实有意义创建EventEmitter的实例并为其指定属性:

var EventEmitter = require('events').EventEmitter;
var obj = new EventEmitter();

obj.doStuff = function() {
  this.emit('stuff');
};

这里你不需要util.inherits,因为你只有一个实例,所以没有链条可供设置。

答案 2 :(得分:-1)

这是一个完全疯狂的猜测,因为我只为浏览器编写了JavaScript。但是,您无法在创建对象文字之后在对象上调用EventEmitter吗?

myObject = {
    myFunction: function() {
        console.log('foo');
    },
    urFunction: function() {
        console.log('bar');
    }
};
EventEmitter.call(myObject);