web-sys 中的继承

JS 类之间的继承是 Web 上 DOM 工作原理的核心,因此,web-sys 提供对这种继承层次结构的访问非常重要!在使用 web-sys 时,您可以通过几种方式访问继承层次结构。

使用 Deref 访问父类

与 Rust 中的智能指针类似,web_sys 中的所有类型都实现了 Deref 到其父 JS 类。这意味着,例如,如果您有一个 web_sys::Element,则可以隐式地从该元素创建一个 web_sys::Node


# #![allow(unused_variables)]
#fn main() {
let element: &Element = ...;

element.append_child(..); // call a method on `Node`

method_expecting_a_node(&element); // coerce to `&Node` implicitly

let node: &Node = &element; // explicitly coerce to `&Node`
#}

使用 Deref 允许您以符合人体工程学的方式向上遍历继承层次结构到父类以及更高级别,从而使用 . 运算符访问所有方法。

使用 AsRef 访问父类

除了 Deref 之外,AsRef 特性还为 web_sys 中的所有类型在继承层次结构中的所有类型实现了。例如,对于 HtmlAnchorElement 类型,您会发现


# #![allow(unused_variables)]
#fn main() {
impl AsRef<HtmlElement> for HtmlAnchorElement
impl AsRef<Element> for HtmlAnchorElement
impl AsRef<Node> for HtmlAnchorElement
impl AsRef<EventTarget> for HtmlAnchorElement
impl AsRef<Object> for HtmlAnchorElement
impl AsRef<JsValue> for HtmlAnchorElement
#}

您可以使用 .as_ref()web_sys 中的类型显式地获取对任何父类的引用。请注意,由于 AsRef 实现的数量,您可能需要类型推断指导。

使用 JsCast 访问子类

最后,wasm_bindgen::JsCast 特性可用于实现各种类型之间的转换。它支持类型之间的静态未经检查的转换,以及类型之间的动态运行时检查的转换(使用 instanceof)。

有关此特性的更多文档,请参阅 特性本身