web-sys 中的繼承

JS 類別之間的繼承是網頁上 DOM 如何運作的基礎,因此 web-sys 提供對此繼承層次的存取權限非常重要!在使用 web-sys 時,您可以使用幾種方式來存取繼承層次。

使用 Deref 存取父類別

與 Rust 中的智能指標類似,web_sys 中的所有類型都實作了 Deref 以指向其父 JS 類別。例如,如果您有一個 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)。

您可以在特性本身找到更多相關文件