web-sys 中的繼承

JS 類別之間的繼承是網頁上 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)。

有關此內容的更多文件可以在特徵本身中找到