我知道如何为每个对象添加新方法 - 通过扩展Object的原型:
Object.prototype.foo = function() { };
但是,是否可以仅为DOM元素节点定义新方法? DOM元素节点对象是否具有原型?或者可能存在用于DOM节点总体的原型吗?
还是原型对象仅存在于内置对象中?
我知道如何为每个对象添加新方法 - 通过扩展Object的原型:
Object.prototype.foo = function() { };
但是,是否可以仅为DOM元素节点定义新方法? DOM元素节点对象是否具有原型?或者可能存在用于DOM节点总体的原型吗?
还是原型对象仅存在于内置对象中?
可以,但不是所有浏览器都支持。Internet Explorer 8(在一定程度上)以及Firefox、Chrome、Opera和Safari都支持DOM prototypes。
HTMLElement.prototype.toggle = function () {
this.style.display = this.style.display == 'none' ? '' : 'none';
}
许多人认为通过修改DOM对象的原型是不良做法。Kangax在这个问题上有一篇很棒的文章:http://perfectionkills.com/whats-wrong-with-extending-the-dom/。然而,DOM原型允许我们在不支持标准方法的环境中实现基于标准的方法,就像ECMAScript 5版方法的垫片(shims)一样。
Object.prototype
,但这并非普遍适用(例如,IE不支持)。通常,像DOM元素这样的宿主对象没有义务执行此操作;事实上,宿主对象不受适用于本机JavaScript对象的许多规则的约束,因此您永远不应依赖DOM元素来支持此类操作。selec
对象添加到HTML元素节点中,那么我就可以像这样使用你的函数:input.selec.get(); input.selec.set(5,8);
- Šime Vidas$.fn
来实现类似的功能,就像插件一样。否则,在IE中没有某种元素包装对象(例如jQuery的)是不可能的。 - Tim DownObject.prototype
。@Šime包装几乎肯定是目前的最佳选择。 - Andy Eselec
的全局对象中 - http://vidasp.net/js/selection.js - 这样我就可以这样使用它:selec.get(input); selec.set(input, 3, 4);
。我以后会扩展这个想法。 - Šime VidasObject
对象,都是不好的做法。this.parentNode.id
比$(this).parent().attr("id")
快几十倍。这就是为什么我想避免在简单任务中使用包装器的原因。 - Šime Vidas
HTMLDivElement
?为什么不向所有HTML元素添加一个原型呢? - vsync