开发者社区> 问答> 正文

在javascript中,monkey patching(即给内置对象扩展方法)是一种好的编程习惯吗?

《javascript语言精粹》一书4.7节(P32),它的标题是“给类型增加方法”,全书也多次是建立在此基础上的编程(如Function.method()),但是几天前我看了由三生石上翻译的文章“javascript秘密花园”(http://www.cnblogs.com/sanshi/archive...),其中有这么一节内容,却持了一种完全相反的观点:

扩展内置类型的原型(Extension of native prototypes)
一个错误特性被经常使用,那就是扩展Object.prototype或者其他内置类型的原型对象。
这种技术被称之为monkey patching并且会破坏封装。虽然它被广泛的应用到一些JS类库中比如Prototype, 但是我仍然不认为为内置类型添加一些非标准的函数是个好主意。
扩展内置类型的唯一理由是为了和新的JavaScript保持一致,比如Array.forEach。 (译者注:这是编程领域常用的一种方式,称之为Backport,也就是将新的补丁添加到老版本中。) The only good reason for extending a built-in prototype is to backport the features of newer JavaScript engines; for example, Array.forEach.
总结(In conclusion)
在写复杂的JavaScript应用之前,充分理解原型链继承的工作方式是每个JavaScript程序员必修的功课。 要提防原型链过长带来的性能问题,并知道如何通过缩短原型链来提高性能。更进一步,绝对不要扩展内置类型的原型,除非是为了和新的JavaScript引擎兼容。

展开
收起
a123456678 2016-03-10 18:02:18 3002 0
1 条回答
写回答
取消 提交回答
  • 一般来说,业界公认的是持后一种观点,不过如果你觉得你的代码是可控的话,扩展内置对象的prototype是很方便的一种方式(prototype库中大量使用了这种手段),尤其是扩展后以原对象实例为this上下文调用,api比较美观直接,否则的话,把对象实例作为参数传给方法,看起来就不那么“面向对象”了,当然,这个问题可以通过给原对象封装一层wrap来解决,比如jquery的包装,可以在$实例化的dom对象上调用方法,并且可以链式调用。

    另外一点,如果你扩展了内置对象的prototype,那么在遍历对象属性的时候要小心了,有些可能不是你想要的,可以通过hasOwnProperty过滤一下

    2019-07-17 18:58:06
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载