Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构造函数作为事件发射器_Javascript_Oop_Node.js_Events - Fatal编程技术网

Javascript 构造函数作为事件发射器

Javascript 构造函数作为事件发射器,javascript,oop,node.js,events,Javascript,Oop,Node.js,Events,我想为node.js中的一些工作编写一个构造函数。除此之外,我想记录它使用事件发射器创建的实例数。目前,我通过给构造函数对象一个方法来实现这一点,该方法是一个事件发射器。例如: var EventEmitter = require('events').EventEmitter; function MyObject() { ... MyObject.events.emit('createdMyObject') } MyObject.events = new EventEmitt

我想为node.js中的一些工作编写一个构造函数。除此之外,我想记录它使用事件发射器创建的实例数。目前,我通过给构造函数对象一个方法来实现这一点,该方法是一个事件发射器。例如:

var EventEmitter = require('events').EventEmitter;

function MyObject() {
    ...
    MyObject.events.emit('createdMyObject')
}

MyObject.events = new EventEmitter();

/* somewhere else... */

MyObject.events.on('createdMyObject', function () {
    // Do something when a new instance is created.
});
var EventEmitter = require('events').EventEmitter;

MyObj = function (a) {
    this.a = a;
    MyObj.emit('new')
}

MyObj.__proto__ = EventEmitter.prototype;

MyObj.on('new', function () {
    console.log('A new myObj was constructed.');
});

var myObj = new MyObj(1);
我真正喜欢的是构造函数更直接地发出事件,这样我就可以用如下方式监听它们:

MyObject.on('createdMyObject', function () {
    // Do something when a new instance is created.
});
有办法做到这一点吗


请注意,我不需要实例是事件发射器(当你用谷歌搜索它时,有很多这样的例子)。我想要一些与其他OO语言中的类方法等效的东西。

你能不能把
事件别名一下。on
on
?:

// Note: can't use simple function assignment because we need
// the "this" inside on to point to events instead of MyObject

MyObject.on = function (eventType,callback) {
    MyObject.events.on(eventType,callback);
}
它并没有去掉MyObjects.events,只是提供了一种添加事件处理程序的替代方法


补充答复 如果您确实希望对象成为事件发射器,那么您可能希望从EventEmitter对象继承?如果是这样,只需执行常规继承:

function MyObject() {
    /*
     * MyObject specific stuff here
     */

    this.emit('createdMyObject');
}

// Now we inherit from an EventEmitter object:
MyObject.prototype = Object.create(EventEmitter.prototype);

您不能将
事件别名为。on
on

// Note: can't use simple function assignment because we need
// the "this" inside on to point to events instead of MyObject

MyObject.on = function (eventType,callback) {
    MyObject.events.on(eventType,callback);
}
它并没有去掉MyObjects.events,只是提供了一种添加事件处理程序的替代方法


补充答复 如果您确实希望对象成为事件发射器,那么您可能希望从EventEmitter对象继承?如果是这样,只需执行常规继承:

function MyObject() {
    /*
     * MyObject specific stuff here
     */

    this.emit('createdMyObject');
}

// Now we inherit from an EventEmitter object:
MyObject.prototype = Object.create(EventEmitter.prototype);

使用构造函数的非标准(但显然非常常用)
\uuuu proto\uuu
属性可以解决这个问题。例如:

var EventEmitter = require('events').EventEmitter;

function MyObject() {
    ...
    MyObject.events.emit('createdMyObject')
}

MyObject.events = new EventEmitter();

/* somewhere else... */

MyObject.events.on('createdMyObject', function () {
    // Do something when a new instance is created.
});
var EventEmitter = require('events').EventEmitter;

MyObj = function (a) {
    this.a = a;
    MyObj.emit('new')
}

MyObj.__proto__ = EventEmitter.prototype;

MyObj.on('new', function () {
    console.log('A new myObj was constructed.');
});

var myObj = new MyObj(1);

将创建预期的
{a:1}
对象,创建事件将触发console.log!如果任何人都可以使用类似于
Object.create
的方法来提供此行为的替代路径,那么出于法规遵从性的原因,这当然是最好的选择。

这可以通过使用构造函数的非标准(但显然非常常用)的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性来解决。例如:

var EventEmitter = require('events').EventEmitter;

function MyObject() {
    ...
    MyObject.events.emit('createdMyObject')
}

MyObject.events = new EventEmitter();

/* somewhere else... */

MyObject.events.on('createdMyObject', function () {
    // Do something when a new instance is created.
});
var EventEmitter = require('events').EventEmitter;

MyObj = function (a) {
    this.a = a;
    MyObj.emit('new')
}

MyObj.__proto__ = EventEmitter.prototype;

MyObj.on('new', function () {
    console.log('A new myObj was constructed.');
});

var myObj = new MyObj(1);

将创建预期的
{a:1}
对象,创建事件将触发console.log!如果任何人都可以使用类似于
Object.create
的方法提供此行为的替代路径,那么出于法规遵从性的原因,这当然是最好的选择。

这是一个示例,如何构造作为事件管理器的对象

```


```

这是一个示例,如何构造作为事件emmiter的对象

```


```

它可以工作,但我更希望构造函数是一个真正的事件发射器。第二个答案似乎使实例成为事件发射器,这不是问题所在。我真的需要构造函数作为发射器,所以我只有一件事可以设置侦听器。它可以工作,但我更希望构造函数是真正的事件发射器。第二个答案似乎使实例成为事件发射器,这不是问题所在。我真的需要构造函数作为发射器,所以我只有一个东西可以设置侦听器。对不起,这是一个对象。我在构造事件发射器对象时没有问题。我想构造一个事件发射器函数(如标题中所述)。对不起,这是一个对象。我在构造事件发射器对象时没有问题。我想构造一个事件发射器函数(如标题中所述)。