【问题标题】:How to "correctly" create an object which inherits from Element?如何“正确”创建一个继承自 Element 的对象?
【发布时间】:2012-10-02 02:23:17
【问题描述】:

我正在编写一个涉及大量 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) 推荐一种在不增加 Element 的情况下实现这种效果的优雅方式,或者 b) 提供一个令人信服的理由说明为什么我不应该打破“不要增加内置”规则这种情况。

非常感谢, 贾拉贝克

【问题讨论】:

    标签: javascript xml html dom


    【解决方案1】:

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

    首先 - 您不必扩充任何原型。如果你只是做somedomnode.myweirdname='foo' 它将成为该对象的一个​​字段。这就是javascript所做的;) 因此,当没有版本时,您将得到 undefined 而不是 null。

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

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

    myobject.node

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

    var myobject = createDomNodeWrapper(domnode)

    【讨论】:

    • 关于您的第一个示例的问题:somedomnode.myweirdname='foo';我不是每次创建节点时都必须这样做吗?我在我的应用程序的几个不同位置创建元素、节点和属性,似乎通过修改原型,我可以省去这个麻烦。
    • 那么我不完全理解您的版本控制想法,因为如果您向原型添加一个字段,我假设您希望将该字段设置为某个值(对于每个元素)。如果您在原型上设置了一次值并稍后在原型上再次更改它,那么您将在任何地方更改它(包括较旧的实例)。那么,如果您为所有元素设置它或者只是为所有元素设置相同的值,那么如何节省任何麻烦呢?
    • 我明白你在说什么。你的解释现在更有意义了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2019-12-05
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多