gettersetter

這兩個屬性可以與 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 參數。

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

#![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);
}
}

注意!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;
};