如何在NodeJS中扩展事件的对象 – 文字对象?
我想让我的Node.js对象强制转换事件 。 现在,如果我创build“静态”对象并将它们实例化,这不是问题,但是当我的对象没有静态的祖父时,如何做到这一点,就像使用对象字面符号创build对象一样 ?
我习惯于编写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 类似的标记对象。
为什么不使用组合而不是inheritance?
var myObject = { myFunction: function() { console.log('foo'); }, urFunction: function() { console.log('bar'); }, emitter: new EventEmitter() }
不幸的是,你想要的对象文字语法是不可能的。 这是因为
var obj = {};
相当于
var obj = Object.create(Object.prototype);
因为obj
的原型在创build时已经被固定为Object.prototype
,你不能在以后改变它。
既然你只是想要一个实例,我认为创build一个EventEmitter
的实例并为其分配属性是EventEmitter
:
var EventEmitter = require('events').EventEmitter; var obj = new EventEmitter(); obj.doStuff = function() { this.emit('stuff'); };
这里你不需要util.inherits
,因为你只有一个实例,所以没有链设置。
这是一个完全疯狂的猜测,因为我只为浏览器编写JavaScript。 但是,你不能在创build对象文字后在对象上调用EventEmitter
吗?
myObject = { myFunction: function() { console.log('foo'); }, urFunction: function() { console.log('bar'); } }; EventEmitter.call(myObject);