根据Node.js文档:
注意:不鼓励使用
util.inherits()
。请使用ES6类并扩展关键字以获得语言级继承支持。另请注意,这两种样式在语义上不兼容。
https://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor
答案 0 :(得分:1)
正如引言所说,你应该使用ES6 class
和extends
关键字来获取语言级继承支持而不是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()
的新对象。