Прототипирование массива для наследования от EventEmitter в Node.js

В настоящее время я работаю над проектом, в котором мне нужно наследовать от EventEmitter. Мне нужен массив для генерации событий в определенных случаях, например, когда превышена некоторая длина.

Я использовал этот фрагмент:

var events = require('events');
Array.prototype.__proto__ = events.EventEmitter.prototype;

Он отлично работает, но говорят, что это анти-шаблон.

В другом вопросе предлагается использовать:

util.inherits(Array, events.EventEmitter.prototype);

Но это НЕ работает. Так как же правильно это сделать?


person gochomugo    schedule 19.08.2014    source источник
comment
Не связывайтесь с родным Array. Просто создайте обертку вокруг него!   -  person Bergi    schedule 19.08.2014
comment
Как бы вы построили оболочку вокруг Array и EventEmitter?   -  person gochomugo    schedule 24.08.2014


Ответы (1)


Проблема здесь в том, что это изменит все массивы в вашем приложении, а не только один. В этой ситуации было бы лучше использовать новый тип, который расширяется от EventEmitter и делегирует массив.

i.e.

// Create a new object that ...
function MyEventArray() {
    // ...owns an Array as property...
    this.array = new Array();
}

// ... and extends from EventEmitter...
MyEventArray.prototype = Object.create(EventEmitter.prototype);
MyEventArray.prototype.constructor = MyEventArray;

// ... and has functions that delegate to the array.
MyEventArray.prototype.push(obj) {
    this.array.push(obj);
}
...


// This object is an EventEmitter and can be used like an Array:
var myArray = new MyEventArray();
myArray.push(someStuff);
person treeno    schedule 19.08.2014
comment
Было бы полезно дополнить это примером кода, как это сделать ???? - person gochomugo; 24.08.2014
comment
Я добавил пример. Существует даже принцип проектирования, согласно которому что-то вроде делегирования лучше, чем наследование. Я не всегда согласен с этим, однако я думаю, что это намного лучше, чем множественное наследование, как здесь. - person treeno; 24.08.2014
comment
Придется ли мне писать такие методы, как push и map, которые делегируют массив? Разве это не утомительно? - person gochomugo; 25.08.2014
comment
Да, именно поэтому я не всегда согласен с этим принципом ;-). Но это кажется мне лучшим вариантом, поскольку множественного наследования нет, и изменение родительского прототипа массива будет применяться глобально (изменить все массивы). - person treeno; 26.08.2014
comment
Это решило мою проблему, хотя для делегирования методов требуется время от времени обновлять. Я принимаю этот ответ. :-) - person gochomugo; 06.01.2015