我在这里和那里发现了一些关于如何修改JavaScript对象原型的建议吗?我个人并不认为这可能是一个问题。例如将Array对象扩展为具有map和include方法或创建更强大的Date方法?为什么不喜欢修改JavaScript对象的原型?
回答
问题是原型可以在几个地方修改。例如,一个库会将地图方法添加到Array的原型,并且您自己的代码将添加相同但具有其他用途的代码。所以一个实现将被打破。
正如bjornd指出的那样,monkey-patching仅在涉及多个库时才成问题。因此,如果您正在编写可重用的库,那么这不是一个好的做法。但是,在JavaScript中使用主机对象时,它仍然是解决跨浏览器兼容性问题的最佳技术。
参见this link当prototype.js和json2.js一起使用时发生真正意外。
主要是因为命名空间冲突。我知道Prototype框架在保持其名称与本地包含的名称不同的许多问题。
有公用事业提供给人们的两种主要的方法..
原型
添加到一个对象的原型功能。 MooTools和原型做到这一点。
优点:
- 超级简单的访问。
缺点:
- 可以用大量的系统内存。虽然现代浏览器只是从构造函数中获取属性的实例,但一些较旧的浏览器会为构造函数的每个实例存储每个属性的单独实例。
- 不一定总是可用。
我的意思“不可用”是这样的:
假设你有从document.getElementsByTagName
的NodeList并希望通过他们进行迭代。你做不到..
document.getElementsByTagName('p').map(function() { ... });
..因为它是一个NodeList,而不是一个数组。以上将给你一个错误,如:Uncaught TypeError: [object NodeList] doesn't have method 'map'
。
我应该注意到,有很简单的方法可以将NodeList和其他类似数组的对象转换为真正的数组。
收集
在上面创建一个全新的全局变量和库存打桩实用程序。 jQuery和Dojo这样做。
优点:
- 总是存在的。
- 内存使用量低。
缺点:
- 没有放在相当的漂亮。
- 有时可能会感到尴尬。
有了这个方法,你仍然不能做..
document.getElementsByTagName('p').map(function() { ... });
..但是你可以做..
jQuery.map(document.getElementsByTagName('p'), function() { ... });
..但由马特指出,在通常使用,你会做以上与..
jQuery('p').map(function() { ... });
哪个更好?
最终,它取决于你。如果您可能会被覆盖/覆盖的风险,那么我会强烈建议原型制作。这是我喜欢的风格,我觉得风险是值得的结果。如果你不像我一样确定,那么收集也是一种很好的风格。他们都有优点和缺点,但总的来说,他们通常会产生相同的最终结果。
Nicholas C. Zakas有一篇很好的文章解释了为什么这种做法不适合任何程序员在团队或客户项目中的想法(也许你可以为了教育目的做一些调整,但不适合一般项目使用)。
可维护的JavaScript:不要修改的对象,你并不拥有:http://stackoverflow.com: https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/
- 1. 你最喜欢的Mootools/Prototype原生对象原型是什么?
- 2. 为什么比JavaScript原型更喜欢默认值()?
- 3. JavaScript:修改对象变量的原型?
- 4. 为什么JVM的GC喜欢不变的对象?
- 5. 你喜欢什么,你对Scrum过程有什么不喜欢的?
- 6. 为什么取消引用unique_ptr不会修改原始对象
- 7. 为什么Facebook的不喜欢这个
- 8. 为什么Adblock的不喜欢串
- 9. 原型:为什么修改“子”对象实例还会修改“父”对象实例?
- 10. 为什么Cocoa不喜欢这个URL?
- 11. 为什么使用Javascript对象,而不是原型
- 12. 为什么IE7不喜欢这一点的Javascript?
- 13. 为什么Facebook插入JavaScript时不喜欢它的参数?
- 14. 对于Facebook的Javascript喜欢
- 15. 修改内置对象原型
- 16. 为什么list(my_list)修改对象?
- 17. 为什么我的Like查询被Toad喜欢,但不被C#喜欢?
- 18. JavaScript中的对象为什么不能成为其本身的原型?
- 19. 为什么原始类型的数组不被视为对象
- 20. 为什么脚本不喜欢使用MySQLi,但对MySQL有效?
- 21. Facebook喜欢一个对象
- 22. 的JavaScript/Node.js的:为什么原型.__ proto__ =原型,而不是新
- 23. 为什么在Javascript RegExp有一个双对象原型
- 24. 为什么我需要使用Javascript对象原型
- 25. 为什么修改一个对象数组不会改变我的对象?
- 26. 为什么改变原型(js)不好?
- 27. Javascript对象原型
- 28. 比较喜欢原始类型Java中
- 29. SQL不喜欢和喜欢
- 30. 喜欢但不喜欢
类似的命名空间冲突也与jQuery插件(这是猴子的补丁jQuery的本身)发生/ q/5740974/479863 – 2011-06-03 05:56:23
在这方面,如果他们决定使用多个库并且不知道代码中发生了什么,那么我觉得这是开发者的错......但是这确实回答了我的问题,谢谢。 – colourandcode 2011-06-03 06:02:09
您会希望开发人员了解像JQuery或DoJo这样的大型库的所有内部结构和实现吗?我怀疑他们是否会在下一次发布框架之前得到任何实施,并且他们不得不重新开始。图书馆和框架的重点在于你只需要知道如何使用它们。 – 2011-06-03 06:09:10