如何“正确”创建一个继承自Element的对象?

时间:2012-10-01 18:09:35

标签: javascript xml html5 dom

我正在编写一个涉及大量XML操作的HTML5应用程序,此操作的一部分涉及比较两个不同XML元素的版本。

我需要的是每个Element,Attr和TextNode(所有这些都继承自Node,AFAIK)对象被创建为具有关联的版本信息,但仍然能够像普通的Element,Attr或TextNode一样运行。我用来存储版本信息的当前工作解决方案如下:

Node.prototype.MyAppAnnotation = {
        Version : null
};

现在,我知道增加内置类型被认为是不好的形式,但是除了这种技术之外,我对如何获得所需功能感到茫然。我不认为我可以将Node封装在包装器中,因为我需要在包装器上公开与Node相关的属性和函数。我可能能够为包装器编写某种传递函数,但这看起来很笨重。

我觉得因为我正在编写的应用程序是一个HTML5应用程序,因此只需要在最现代的浏览器上运行(所有这些浏览器都支持内置增强功能),这使得这种技术更加合适。此外,通过为我的增强对象提供足够模糊的名称,我可以避免所有命名冲突(故意冲突除外)。我还使用Google的Closure库探索了基于继承的解决方案。但是,似乎因为Element,Node和TextNode没有直接构造函数(即它们是从Document对象创建的),这种技术也不起作用。

我想知道是否有人可以a)推荐一种优雅的方式来实现这种效果而不增加元素,或者b)提供一个令人信服的理由为什么我不应该打破“不要增加内置插件”规则这种情况。

非常感谢, Jarabek

1 个答案:

答案 0 :(得分:1)

你的想法在理论上是有效的,但在阅读时我会有一种奇怪的感觉。

首先 - 您不必增加任何原型。如果您只是somedomnode.myweirdname='foo',它将成为该对象的字段。这就是javascript所做的;) 因此,当没有版本时,您将获得未定义而不是null。

但是,如果你想要添加更多功能或将dom节点包装在任何东西中 - 这有一些历史。大多数历史都是由jQuery之类的东西主导:)

只需创建一个包含该节点的字段的对象即可。然后你可以简单地访问它:

myobject.node

使用一些构造函数或工厂函数创建对象:

var myobject = createDomNodeWrapper(domnode)