gpt4 book ai didi

javascript - 使函数的行为类似于实例化的 EventEmitter

转载 作者:行者123 更新时间:2023-11-29 21:50:05 25 4
gpt4 key购买 nike

我非常喜欢将函数导出为 JavaScript 模块的主要 API 的模式。原因是在 JS 中,函数基本上可以做典型对象可以做的任何事情,然后再做一些。

所以这对我来说很典型:

function stuff() {}
function thing() { /* shortcut or default behavior */ }
thing.stuff = stuff;
module.exports = thing;

现在我遇到了一种情况,我希望 thing 表现得像 EventEmitter实例 .而且我希望它成为构造函数。

为什么?好吧,thing 将真正遵循 osPreferences 的路线,使用一些选项调用它会将数据保存到磁盘。用户实例化它没有任何意义。 new OSPreferences() 用处不大,因为您的计算机一次只能遵循一组偏好设置。

然而,更改可以随时在我的 API 之外发生。所以有一个巨大的好处:

osPreferences.on('change', fn);

所以问题是,吸收 EventEmitter 实例 行为的可靠模式是什么?简单地遍历一次性实例的所有属性并将它们复制到目标函数是否足够好?是否值得尝试模仿继承与非继承设置?考虑到默认的 this 会被更改,是否有任何奇怪的情况需要考虑?还是有更好、更明智的方式?

最佳答案

Is it good enough to simply loop through all properties of a throwaway instance and copy them to the target function?

是的。您甚至不需要创建一次性实例,只需将所有 EventEmitter.prototype 方法复制到您的函数中,然后将 EventEmitter 应用到它即可。

function osPreferences() { … }
for (var p in EventEmitter.prototype)
osPreferences[p] = EventEmitter.prototype[p];
EventEmitter.call(osPreferences);

Is it worth trying to mimic the inherited vs non-inherited setup?

不是真的。您坚持单例使用您的 api,因此您根本不需要任何继承。

Are there any weird cases to take into account, given that the default this would be changed?

不,EventEmitter is coded quite defensively .当然,您的听众可能会觉得这很不寻常……

关于javascript - 使函数的行为类似于实例化的 EventEmitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29725190/

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