我正在尝试使用 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- 喜欢标记对象。
答案 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);