Intereting Posts

如何在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 类似的标记对象。

Solutions Collecting From Web of "如何在NodeJS中扩展事件的对象 – 文字对象?"

为什么不使用组合而不是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);