2011-06-03 46 views

回答

17

问题是原型可以在几个地方修改。例如,一个库会将地图方法添加到Array的原型,并且您自己的代码将添加相同但具有其他用途的代码。所以一个实现将被打破。

+1

类似的命名空间冲突也与jQuery插件(这是猴子的补丁jQuery的本身)发生/ q/5740974/479863 – 2011-06-03 05:56:23

+0

在这方面,如果他们决定使用多个库并且不知道代码中发生了什么,那么我觉得这是开发者的错......但是这确实回答了我的问题,谢谢。 – colourandcode 2011-06-03 06:02:09

+7

您会希望开发人员了解像JQuery或DoJo这样的大型库的所有内部结构和实现吗?我怀疑他们是否会在下一次发布框架之前得到任何实施,并且他们不得不重新开始。图书馆和框架的重点在于你只需要知道如何使用它们。 – 2011-06-03 06:09:10

6

正如bjornd指出的那样,monkey-patching仅在涉及多个库时才成问题。因此,如果您正在编写可重用的库,那么这不是一个好的做法。但是,在JavaScript中使用主机对象时,它仍然是解决跨浏览器兼容性问题的最佳技术。

参见this link当prototype.js和json2.js一起使用时发生真正意外。

10

主要是因为命名空间冲突。我知道Prototype框架在保持其名称与本地包含的名称不同的许多问题。

有公用事业提供给人们的两种主要的方法..

原型

添加到一个对象的原型功能。 MooTools和原型做到这一点。

优点:

  1. 超级简单的访问。

缺点:

  1. 可以用大量的系统内存。虽然现代浏览器只是从构造函数中获取属性的实例,但一些较旧的浏览器会为构造函数的每个实例存储每个属性的单独实例。
  2. 不一定总是可用。

我的意思“不可用”是这样的:

假设你有从document.getElementsByTagName的NodeList并希望通过他们进行迭代。你做不到..

document.getElementsByTagName('p').map(function() { ... }); 

..因为它是一个NodeList,而不是一个数组。以上将给你一个错误,如:Uncaught TypeError: [object NodeList] doesn't have method 'map'

我应该注意到,有很简单的方法可以将NodeList和其他类似数组的对象转换为真正的数组。

收集

在上面创建一个全新的全局变量和库存打桩实用程序。 jQuery和Dojo这样做。

优点:

  1. 总是存在的。
  2. 内存使用量低。

缺点:

  1. 没有放在相当的漂亮。
  2. 有时可能会感到尴尬。

有了这个方法,你仍然不能做..

document.getElementsByTagName('p').map(function() { ... }); 

..但是你可以做..

jQuery.map(document.getElementsByTagName('p'), function() { ... }); 

..但由马特指出,在通常使用,你会做以上与..

jQuery('p').map(function() { ... }); 

哪个更好?

最终,它取决于你。如果您可能会被覆盖/覆盖的风险,那么我会强烈建议原型制作。这是我喜欢的风格,我觉得风险是值得的结果。如果你不像我一样确定,那么收集也是一种很好的风格。他们都有优点和缺点,但总的来说,他们通常会产生相同的最终结果。

+1

@tylerwashburn:*它必须存储函数/字符串/无论在任何一个实例上*真的吗? Afaik在原型中添加了一些*在构造函数中添加*一次*。实例随后从构造函数原型获取它们的信息。 – KooiInc 2011-06-03 06:21:00

+0

你可以做'$('p')。map(function(){...}'而不是'map'例子你提到。 – 2011-06-03 06:21:18

+0

@KooiInc我不完全确定它是真的,但我已经听说老版本的浏览器会这样做,我会更新我的答案,注意这一点 – Kayla 2011-06-03 06:24:11

相关问题