是否有一般理由不处理Document和Element的原型?
我喜欢创建自己的小框架,因为我当前的项目不需要现有框架的大量功能。
我不需要支持不支持Element / Document-constructor的浏览器,也不会执行不受我控制的脚本。
那么你会建议扩展原型,还是应该按常规方式从Element / Document创建自己的对象?
答案 0 :(得分:8)
您是否计划扩展默认DOM元素?如果是这样,请不要。 Juriy Zaytsev(又名Kangax)清楚地描述了为什么不在What’s wrong with extending the DOM。
答案 1 :(得分:6)
是的,不幸的是。能够通过摆弄DOM原型来增加功能将是可爱的,但在实践中,鉴于当今的技术,它只是不可靠。
Document
,Element
和其他人等可能是浏览器实现的“主机对象”,无法摆弄原型。主机对象可能具有本机JavaScript对象不会具有的许多其他奇怪行为。 DOM节点是IE6-7中的主机对象以及许多旧的,利基和移动浏览器。
即使它们是作为本机JavaScript对象实现的,也没有标准(尚未)描述了它们的构造函数的位置,以便您在.prototype
中进行捕获。 Document
,Element
等只是W3 DOM接口名称,它们没有说明要找到的实现对象。
现代浏览器(IE8本机模式以及Firefox,Opera和WebKit的最新版本)确实可以使构造函数可用,因此您可以开始向Document
或HTMLElement
添加方法。但即使这样,在暴露的对象之间也存在差异,因为并非每个浏览器都提供具有相同名称的DOM接口。 (NodeList
的子接口/实现特别麻烦。)
通过查看Prototype.js框架,您可以看到DOM原型在实践中如何发挥作用。当它工作时,它是非常流畅的。但是因为你无法在任何地方制作原型,你最终会得到一些非常难看的东西,框架必须通过将方法复制到Node的每个实例来处理原型。然后你就遇到了你的代码可能会忘记需要强制执行这种“扩充”的情况,因此它可能会起作用或者不起作用,具体取决于是否有其他功能发生在以前增强同一节点。这导致了非常可怕的特定于浏览器,特定于交互顺序的,竞争条件倾向的调试痛苦。
如果您可以将原型设计工作限制在几个受到良好支持的界面上,并放弃除最新浏览器以外的所有界面,那么您可以放弃它。