扩展内置对象 - 在javascript中,monkey patching(即给内置对象扩展方法)是一种好的编程习惯吗?
大家讲道理
大家讲道理 2017-04-10 12:42:00
0
2
575

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

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua (2)
洪涛

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

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

    左手右手慢动作

    一句话:别耍流氓,不是你的对象你别动手动脚。

    都啥年代了,当年如日中天的 Prototype.js 都寿终正寝了,为啥还想着扩充内置对象?

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!