增加DOM元素节点的原型?

时间:2010-11-16 11:48:15

标签: javascript dom prototype

我知道如何为每个对象添加新方法 - 通过扩充Object的原型:

Object.prototype.foo = function() {  }; 

但是,是否可以仅为DOM元素节点定义新方法? DOM元素节点对象有原型吗?或者一般来说DOM节点可能有原型吗?

或者仅为内置对象存在原型对象吗?

3 个答案:

答案 0 :(得分:25)

是的,但不适用于所有浏览器。 Internet Explorer 8支持DOM原型(在某种程度上),Firefox,Chrome,Opera和Safari也是如此。

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版方法的填充程序一样。

答案 1 :(得分:3)

在某些浏览器中,DOM元素会公开一个原型对象,它也可能继承自Object.prototype,但这并不普遍(例如,IE没有)。通常,DOM元素之类的宿主对象没有义务这样做;事实上,主机对象不受适用于本机JavaScript对象的许多规则的约束,因此您永远不应该依赖DOM元素来支持这种事情。

我建议kangax's excellent article on this subject

答案 2 :(得分:0)

这正是prototype.js所做的,但现在被认为是非常糟糕的做法。 使用包装器/处理程序要好得多。注意,增加任何本机对象,尤其是Object对象,都是不好的做法。

读:

Whats wrong with extending the DOM
Object.prototype is verboten

附录:

虽然在小项目中扩展本机对象,但可以认为安全它实际上会成为一个非常糟糕的习惯。它只比使用函数和变量乱丢全局范围稍微差一点。不仅会发生名称冲突,还会发生实施冲突。随着您混搭的图书馆越来越多,这将变得越来越容易。

将您的实现保留在您自己的对象上是避免任何冲突,名称,实现或其他方式的唯一方法。

所有这一切都说,你可以随心所欲地做到这一点,但是我不会推荐任何被广泛接受为纯粹的不良做法的东西。我坚持我的建议。