gpt4 book ai didi

javascript - node.js EventEmitter 和 iife 模式

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:19 24 4
gpt4 key购买 nike

我有一个关于 javascript 继承而不是 node.js 的具体问题:

// foo.js
var events = require('events');
var util = require('util');

var Foo = (function(){
var foo = {};
events.EventEmitter.call(foo);
foo.init = function(){
foo.emit('bar');
};

util.inherits(parser, events.EventEmitter);

return {
bind: foo.init,
on: foo.on // I suppose this resolves to event emitter's on method
};

}());

module.exports = Foo;

然后,当我尝试调用(例如在 main.js 中)时:

var foo = require('./foo.js');

foo.on('bar', function(){ ... });

在我调用 foo.init(); 之前就生成了错误:

foo.on('bar', function(){ ... })
^
TypeError: Property 'on' of object #<Object> is not a function

当我选择以 IIFE 模式编码时,是否可以从 EventEmitter 继承?或者我的错误与其他问题有关?

最佳答案

如果您想保留此模式,并且您有充分的理由不使用这样的原型(prototype)继承:

FooConstuctor.prototype = new events.EventEmitter();

然后,如果 EventEmitter 需要的只是 on 方法,则只需添加:

Foo.on = events.EventEmitter.prototype.on;

在您创建Foo之后。

仅通过在 Foo 上调用 EventEmitter 的构造函数无法获得 Foo 上的 on 方法,因为 on 方法未附加到构造函数中的 EventEmitter 对象。

原因可能是,在构造函数中为对象分配方法通常被认为是不好的做法,因为这样会为每个对象实例创建一个新函数实例,这通常是不必要且浪费的,并且像这样创建的方法不会直接分配给原型(prototype),这可能会误导其他计划扩展“类”的开发人员。

关于javascript - node.js EventEmitter 和 iife 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17766675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com