Javascript 如何";“正确地”;创建从元素继承的对象?

Javascript 如何";“正确地”;创建从元素继承的对象?,javascript,xml,html,dom,Javascript,Xml,Html,Dom,我正在编写一个HTML5应用程序,它涉及大量XML操作,其中一部分操作涉及比较两个不同XML元素的版本 我需要的是每个元素、Attr和TextNode(它们都继承自Node、AFAIK)对象,这些对象被创建为具有关联的版本信息,但仍然能够像普通元素、Attr或TextNode一样工作。我用于存储版本信息的当前工作解决方案如下: Node.prototype.MyAppAnnotation = { Version : null }; 现在,我知道扩充内置类型被认为是一种糟糕的形式

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

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

Node.prototype.MyAppAnnotation = {
        Version : null
};
现在,我知道扩充内置类型被认为是一种糟糕的形式,但除了这种技术之外,我还不知道如何获得所需的功能。我认为我不能将节点封装在包装器中,因为我需要在包装器中公开与节点相关的属性和函数。我可能能够为包装器编写某种传递函数,但这似乎非常笨拙

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

我想知道是否有人可以a)推荐一种在不增加元素的情况下实现这种效果的优雅方法,或者b)提供一个令人信服的理由,说明在这种情况下我不应该违反“不增加内置项”规则

非常感谢,,
Jarabek

你的想法在理论上是正确的,但当我读到它时,我有一种奇怪的感觉

首先,你不需要增加任何原型。如果只执行
somedomnode.myweirdname='foo'
操作,它将成为该对象的一个字段。javascript就是这样做的;) 因此,当没有版本时,您将得到未定义的版本,而不是null

但是,如果您想添加更多功能或将dom节点包装到任何东西中,那么这有一点历史。大部分历史都是由jQuery之类的东西主导的:)

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

myobject.node

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


var myobject=createDomNodeWrapper(domnode)

你的想法在理论上是有效的,但当我读到它时,有一种奇怪的感觉

首先,你不需要增加任何原型。如果只执行
somedomnode.myweirdname='foo'
操作,它将成为该对象的一个字段。javascript就是这样做的;) 因此,当没有版本时,您将得到未定义的版本,而不是null

但是,如果您想添加更多功能或将dom节点包装到任何东西中,那么这有一点历史。大部分历史都是由jQuery之类的东西主导的:)

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

myobject.node

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


var myobject=createDomNodeWrapper(domnode)

关于第一个示例的问题:somedomnode.myweirdname='foo';我不是每次创建节点时都要这样做吗?我在我的应用程序中的几个不同位置创建元素、节点和属性,似乎通过修改原型,我可以省去这些麻烦。然后我不完全理解您的版本控制想法,因为如果您向原型添加一个字段,我假设您希望将该字段设置为某个值(针对每个元素)。如果您在prototype上设置一次值,然后在prototype上再次更改它,那么您可以在任何地方更改它(包括旧的实例)。那么,如果你为所有元素设置它,或者只是在所有元素上设置相同的值,那么如何避免任何麻烦呢?我明白你的意思了。你的解释现在更有意义了。谢谢。关于第一个示例的问题:somedomnode.myweirdname='foo';我不是每次创建节点时都要这样做吗?我在我的应用程序中的几个不同位置创建元素、节点和属性,似乎通过修改原型,我可以省去这些麻烦。然后我不完全理解您的版本控制想法,因为如果您向原型添加一个字段,我假设您希望将该字段设置为某个值(针对每个元素)。如果您在prototype上设置一次值,然后在prototype上再次更改它,那么您可以在任何地方更改它(包括旧的实例)。那么,如果你为所有元素设置它,或者只是在所有元素上设置相同的值,那么如何避免任何麻烦呢?我明白你的意思了。你的解释现在更有意义了。谢谢