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

Red*_*dro 9 javascript events object-literal node.js eventemitter

我试图让我的Node.js对象投射事件.现在,如果我创建"静态"对象并实例化它们,这不是问题,但是当我的对象没有静态爷爷时,如何使用对象文字符号创建对象时如何执行此操作?

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

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

myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  }
};
Run Code Online (Sandbox Code Playgroud)

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

现在我如何允许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
Run Code Online (Sandbox Code Playgroud)

或者将我的函数/原型添加到如此构造的东西:

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);
Run Code Online (Sandbox Code Playgroud)

如何myObject在保持对象文字符号的同时允许发出事件?这么多令人困惑的方法,但不是那些JSON 类似的标记对象.

zia*_*aab 9

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

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

  • 是.如果你想让你的对象像发射器一样嘎嘎叫,你甚至可以添加一些你将使用的发射器函数,如`var myObject = {... emitter:new EventEmitter(),emit:myObject.emitter.emit, on:myObject.emitter.on,...} (2认同)

J. *_*ett 8

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

var obj = {};
Run Code Online (Sandbox Code Playgroud)

相当于

var obj = Object.create(Object.prototype);
Run Code Online (Sandbox Code Playgroud)

obj原型中,原型固定Object.prototype在创建时,你不能在以后改变它.

因为你只想要一个单一实例,我认为它确实是有意义的创建一个实例EventEmitter,并指定属性吧:

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

obj.doStuff = function() {
  this.emit('stuff');
};
Run Code Online (Sandbox Code Playgroud)

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