代码之家  ›  专栏  ›  技术社区  ›  Å ime Vidas Zim84

增加DOM元素节点的原型?

  •  9
  • Å ime Vidas Zim84  · 技术社区  · 14 年前

    我知道如何向每个对象添加新方法-通过增加对象的原型:

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

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

    或者原型对象只存在于内置对象中?

    3 回复  |  直到 7 年前
        1
  •  24
  •   Andy E    7 年前

    是的,但不是所有浏览器都有。InternetExplorer8支持DOM原型(在一定程度上),就像火狐、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版方法的垫片一样。

        2
  •  3
  •   Tim Down    14 年前

    在某些浏览器中,dom元素确实公开了原型对象,原型对象也可能继承自 Object.prototype 但这并非普遍正确(例如,事实并非如此)。一般来说,宿主对象(如dom元素)没有义务这样做;事实上,宿主对象不受许多应用于本机JavaScript对象的规则的约束,因此您不应该依赖dom元素来支持这种情况。

    我推荐 kangax's excellent article on this subject .

        3
  •  0
  •   BGerrissen    14 年前

    这正是 prototype.js 是的,但现在被认为是非常糟糕的做法。 最好使用包装机/处理程序。注意,扩充任何本机对象,特别是 Object 目标,是不好的练习。

    阅读:

    Whats wrong with extending the DOM
    Object.prototype is verboten

    附录:

    在小项目中扩展本机对象时,可以考虑 安全的 它实际上会成为一个非常糟糕的哈比人。它只比在全局范围内乱扔函数和变量稍微差一点。不仅会发生名称冲突,还会发生实现冲突。这将变得越来越像一个图书馆,你越混搭。

    将实现保存在自己的对象上是避免任何冲突、名称、实现或其他情况的唯一方法。

    尽管如此,这是你的过氧化物酶体做你想做的,但我不会推荐任何被广泛接受为纯粹的坏做法。我坚持我的建议。