是的,这基本上是原型的主要问题。
原型在不同浏览器上的工作方式不同。在允许您使用宿主对象的原型(如 HTMLTableRowElement)的浏览器上,它会将自己的函数添加toggleClassName
到这些原型中,因此每次获得 a 时,<tr>
您都可以直接在其上调用该方法。哇哦,多方便啊!
不幸的是,能够改变 DOM 节点的原型是没有 ECMAScript 或 DOM 标准真正认可的。它恰好可以在 Firefox 中工作,因为 Mozilla 就是这样,但你不能指望它在所有浏览器中都能工作;它肯定不会在 IE 中工作。
因此,对于其他浏览器,您必须告诉 Prototype 将其自己的方法添加('augment')到您要处理的每个对象上:
Element.extend(this);
现在您可以this.toggleClassName
在所有浏览器上安全地调用。
一旦你增强了那个特定<tr>
的,你以后每次访问它时,它仍然会被增强,所以你仍然可以调用toggleClassName
它。更重要的是,如果你碰巧通过 Prototype 方法访问一个元素——例如$('mytrid')
——它会自动为你增加它。
这不是一个方便的功能:这是一个陷阱。它鼓励您编写恰好在您的浏览器上工作的代码(支持原型黑客),但在其他地方会失败。它鼓励您编写代码,如果您以特定顺序与页面元素交互,则可以确保它们在调用增强方法之前都得到增强,但如果您以不同顺序与元素交互,则会失败。
这是一场调试灾难,也是我不使用原型的原因。
(下周,为了获得额外的火焰诱饵乐趣,为什么我也不使用 jQuery。)