《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引擎兼容。
一般来说,业界公认的是持后一种观点,不过如果你觉得你的代码是可控的话,扩展内置对象的prototype是很方便的一种方式(prototype库中大量使用了这种手段),尤其是扩展后以原对象实例为this上下文调用,api比较美观直接,否则的话,把对象实例作为参数传给方法,看起来就不那么“面向对象”了,当然,这个问题可以通过给原对象封装一层wrap来解决,比如jquery的包装,可以在$实例化的dom对象上调用方法,并且可以链式调用。
另外一点,如果你扩展了内置对象的prototype,那么在遍历对象属性的时候要小心了,有些可能不是你想要的,可以通过hasOwnProperty过滤一下
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。