web-sys 中的继承

JS 类之间的继承是 DOM 在 Web 上工作的基础,因此 `web-sys` 也非常重要,它需要提供对这种继承层次结构的访问!在使用 `web-sys` 时,有几种方法可以访问继承层次结构。

使用 `Deref` 访问父类

就像 Rust 中的智能指针一样,`web_sys` 中的所有类型都对其父 JS 类实现了 `Deref`。这意味着,例如,如果你有一个 `web_sys::Element`,你可以隐式地从中创建一个 `web_sys::Node`

#![allow(unused)]
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)]
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`)。

有关此的更多文档可以在特征本身上找到