9

我正在尝试让我的Node.js对象强制转换事件。现在,如果我制作“静态”对象并实例化它们,这不是问题,但是当我的对象没有静态爷爷时,我该怎么做,比如使用对象文字符号创建对象时?

我习惯于编写 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 的标记对象中却没有一种。

4

3 回答 3

9

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

var myObject = {
  myFunction: function() {
    console.log('foo');
  },
  urFunction: function() {
    console.log('bar');
  },
  emitter: new EventEmitter()
}
于 2012-06-01T01:30:03.697 回答
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这里,因为你只有一个实例,所以没有设置链。

于 2012-06-01T01:21:49.787 回答
-1

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

myObject = {
    myFunction: function() {
        console.log('foo');
    },
    urFunction: function() {
        console.log('bar');
    }
};
EventEmitter.call(myObject);
于 2012-05-31T16:27:13.823 回答