gpt4 book ai didi

javascript - "correctly"如何创建一个继承自Element的对象?

转载 作者:行者123 更新时间:2023-11-28 02:40:46 29 4
gpt4 key购买 nike

我正在编写一个涉及大量 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)提供一个令人信服的理由来说明为什么我不应该打破“不增强内置”规则本案。

非常感谢,贾拉贝克

最佳答案

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

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

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

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

myobject.node

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

var myobject = createDomNodeWrapper(domnode)

关于javascript - "correctly"如何创建一个继承自Element的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678616/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com