web-sys
中的继承
JS 类之间的继承是 DOM 在 Web 上工作的基础,因此,对于 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
trait 也为 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
trait 可用于实现类型之间的各种转换。它支持类型之间的静态未检查转换,以及类型之间的动态运行时检查转换(使用 instanceof
)。
有关此的更多文档可以在trait 本身上找到