gettersetter

這兩個屬性可以與 method 結合使用,以指示這是一個 getter 或 setter 方法。預設情況下,帶有 getter 標記的函式會存取與 getter 函式同名的 JavaScript 屬性。帶有 setter 標記的函式名稱目前必須以 set_ 開頭,它存取的屬性是 set\_ 後的後綴。

考慮以下具有 white_russians 屬性的 getter 和 setter 的 JavaScript 類別

class TheDude {
  get white_russians() {
    ...
  }
  set white_russians(val) {
    ...
  }
}

我們可以使用以下 #[wasm_bindgen] 屬性導入它


# #![allow(unused_variables)]
#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) 的形式使用。請注意,這兩個函式都有一個 this 參數,因為它們都標記了 method

最後,您還可以將參數傳遞給 gettersetter 屬性,以配置要存取的屬性。當明確指定屬性時,方法名稱沒有限制。例如,以下與上述內容等效


# #![allow(unused_variables)]
#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);
}
#}

注意!gettersetter 函式在載入時會在建構函式的原型鏈上找到,快取,然後在每次存取時調用快取的存取器。如果您需要在每次存取時動態遍歷原型鏈,請新增 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;
};