为什么不鼓励使用util.inherits()?

时间:2017-04-23 19:53:15

标签: node.js

根据Node.js文档:

  

注意:不鼓励使用util.inherits()。请使用ES6类并扩展关键字以获得语言级继承支持。另请注意,这两种样式在语义上不兼容。

https://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor

2 个答案:

答案 0 :(得分:1)

正如引言所说,你应该使用ES6 classextends关键字来获取语言级继承支持而不是utils.inherits,这正是原因所在不鼓励使用它:存在更好的替代方案,它们是核心语言的一部分,这就是全部 util.inherits来自那些util不属于语言的时候,它需要你很多样板来定义你自己的继承工具。
如今,语言提供了一种有效的替代方案,使用库本身提供的语言就没有意义了。当然,只要您使用计划来使用ES6,这是正确的 - 否则忽略该注释并继续使用utils.inherits

回复你的评论:

  

util.inherits()如何更复杂?

这不是一个或多或少复杂的问题。出于显而易见的原因,使用核心语言功能应该是使用库特定替代方案的首选方式。

答案 1 :(得分:0)

不鼓励使用 util.inherits 的原因是应该避免更改对象的原型,因为大多数 JavaScript 引擎都在寻找优化,假设原型不会改变。如果这样做,这可能会导致性能不佳。

util.inherits 依赖于 Object.setPrototypeOf 进行此更改,并且该本地方法的 MDN 文档有此警告:

<块引用>

警告:根据现代 JavaScript 引擎优化属性访问的方式,更改对象的 [[Prototype]] 目前在每个浏览器和 JavaScript 引擎中都是非常缓慢的操作。此外,更改继承的影响是微妙而广泛的,不仅限于 Object.setPrototypeOf(...) 语句中花费的时间,还可能扩展到任何可以访问其 [[Prototype]]已更改。

由于此功能是语言的一部分,因此引擎开发人员仍然有责任以高性能方式(理想情况下)实现该功能。在引擎开发人员解决此问题之前,如果您担心性能,则应避免设置对象的 [[Prototype]]。相反,使用 [[Prototype]] 创建具有所需 Object.create() 的新对象。