getter
和 setter
這兩個屬性可以與 method
結合使用,以指示這是一個 getter 或 setter 方法。預設情況下,標記為 getter
的函式會存取與 getter 函式名稱相同的 JavaScript 屬性。setter
的函式名稱目前必須以 set_
開頭,而它存取的屬性是 set\_
後面的後綴。
考慮以下 JavaScript 類別,它具有 white_russians
屬性的 getter 和 setter
class TheDude {
get white_russians() {
...
}
set white_russians(val) {
...
}
}
我們將使用以下 #[wasm_bindgen]
屬性導入它
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { type TheDude; #[wasm_bindgen(method, getter)] fn white_russians(this: &TheDude) -> u32; #[wasm_bindgen(method, setter)] fn set_white_russians(this: &TheDude, val: u32); } }
在這裡,我們導入了 TheDude
類型,並定義了存取每個物件的 white_russians
屬性的能力。這裡的第一個函式是 getter,將在 Rust 中以 the_dude.white_russians()
的形式可用,而後者是 setter,可以以 the_dude.set_white_russians(2)
的形式存取。請注意,由於它們標記為 method
,因此兩個函式都有一個 this
參數。
最後,您還可以將參數傳遞給 getter
和 setter
屬性,以設定要存取的屬性。當明確指定屬性時,對方法名稱沒有限制。例如,以下內容與上述內容等效
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { type TheDude; #[wasm_bindgen(method, getter = white_russians)] fn my_custom_getter_name(this: &TheDude) -> u32; #[wasm_bindgen(method, setter = white_russians)] fn my_custom_setter_name(this: &TheDude, val: u32); } }
注意!getter
和 setter
函式在載入時會在建構子的原型鏈上找到一次,然後快取,並且每次存取都會調用快取的存取器。如果您需要在每次存取時動態地走過原型鏈,請新增 structural
屬性!
// This is the default function Rust will invoke on `the_dude.white_russians()`:
const white_russians = Object.getOwnPropertyDescriptor(
TheDude.prototype,
"white_russians"
).get;
// This is what you get by adding `structural`:
const white_russians = function(the_dude) {
return the_dude.white_russians;
};