Javascript 如何为NodeJS中的事件扩展对象文字对象?

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');

我正在尝试让我的节点.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);
或将我的功能/原型添加到构建的东西上,如:

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这样的函数不存在,无法处理对象文本。请参阅以下答案: