Javascript 如何为NodeJS中的事件扩展对象文字对象?
我正在尝试让我的节点.js对象播放事件。现在,如果我创建“静态”对象并实例化它们,这不是一个问题,但是当我的对象没有静态标记时,比如当使用对象文字符号创建对象时,我该如何做呢 我习惯于编写ExtJS语法,所以我更喜欢对象文字Javascript 如何为NodeJS中的事件扩展对象文字对象?,javascript,events,node.js,object-literal,eventemitter,Javascript,Events,Node.js,Object Literal,Eventemitter,我正在尝试让我的节点.js对象播放事件。现在,如果我创建“静态”对象并实例化它们,这不是一个问题,但是当我的对象没有静态标记时,比如当使用对象文字符号创建对象时,我该如何做呢 我习惯于编写ExtJS语法,所以我更喜欢对象文字 // var EventEmitter = require('events').EventEmitter; // How where when? myObject = { myFunction: function() { console.log('foo');
// 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);
或将我的功能/原型添加到构建的东西上,如:
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的带符号对象中没有一种方法。这完全是胡乱猜测,因为我只为浏览器编写了JavaScript。但是,在创建对象文字后,您不能对对象调用
EventEmitter
myObject = {
myFunction: function() {
console.log('foo');
},
urFunction: function() {
console.log('bar');
}
};
EventEmitter.call(myObject);
不幸的是,您想要的对象文字语法是不可能的。因为
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
,因为您只有一个实例,所以没有链可设置。为什么不使用组合而不是继承
var myObject = {
myFunction: function() {
console.log('foo');
},
urFunction: function() {
console.log('bar');
},
emitter: new EventEmitter()
}
我希望它是那么简单,但不幸的是它不工作。模仿将我的
对象文本
转换为事件发射器
的一种肮脏方式是这样借用:var myObject=new EventEmitter();$。扩展(myClass,myObject)代码>其中myClass
是我的对象文本
。很明显,我在寻找一种更地道的方式。这看起来很有趣。“内部”发射器是否与myObject
将成为发射器时一样“公开”?例如,我可以在一个根函数中self.myObject.emitter.on('customEvent',doSomethinG())代码>(当然提供self=this
设置在同一根目录下)?是。如果你想让你的对象像发射器一样嘎嘎作响,你甚至可以添加一些你将使用的发射器函数,比如'var myObject={…emitter:new EventEmitter(),emit:myObject.emitter.emit,on:myObject.emitter.on,…}聪明。我只是好奇这是多么的通用:我能从一个单独的函数/作用域传递一个发射器并享受同样的乐趣吗?例如,nodejs请求触发onRequest()
,它对myObject
执行某些操作,从而导致事件,这些事件在onRequest()中被监听。现在,第二个(第三个和第n个)同时请求也会执行相同的操作,但应该只侦听由它们自己摆弄myObject
引起的事件。这需要onRequest()
每次都向myObject
传递一个新的发射器,否则myObject
的事件将被onRequest()
的每个运行实例捕获。我不确定我是否100%理解了你的最后一个问题。但是这样看:您继承了EventEmitter
的所有特性。但是,您不是通过扩展EventEmitter
来继承它们,而是通过添加EventEmitter
作为对象的一部分来继承它们。感谢您解释原型的部分。我只是部分理解了发生的事情,认为{}是定义和实例化无构造函数对象的简写。您知道为EventEmitter
实例分配属性的更原生的方法吗,这样我就可以更容易地将对象文本
移植到它们,正如我在对Mattias Buelens的第一条评论中所提到的那样?我不知道通过对象文本进行扩展的原生方法。但是,include jQuery对于node.js项目并不理想,因为jQuery的大部分内容都是关于操作DOM的。我建议包括一个实用程序库,如或。你可以用npm安装它。解释得很好,但是如果你创建了一个可重用的库,你提出的解决方案是不明智的。在这种情况下,您不希望在构建之后添加函数。如果jQuery有这样的功能,您是否可以尝试从jQuery js文件中查找相关部分并仅复制这些部分?很好的问题,我喜欢使用Object.create()和基于浏览器的环境中的文字,但现在使用node js一段时间,我的结论是,类似ES5的对象处理在某种程度上没有得到充分利用。原因可能是像util.inherits这样的函数不存在,无法处理对象文本。请参阅以下答案: