您好,匿名用户
随意问技术百科期待您的加入

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

0 投票

《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引擎兼容。

请问这两种观点谁的是正确的,或者说哪个编程习惯更好些?为什么?

用户头像 提问 2012年 12月1日 @ Rengar 上等兵 (236 威望)
分享到:

1个回答

0 投票

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

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

用户头像 回复 2012年 12月1日 @ hacker 上等兵 (362 威望)
提一个问题:

相关问题

0 投票
1 回复 50 阅读
0 投票
1 回复 34 阅读
0 投票
1 回复 29 阅读
0 投票
1 回复 28 阅读
0 投票
1 回复 41 阅读
用户头像 提问 2012年 12月1日 @ Irelia 上等兵 (292 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...