inspectable

預設情況下,從 Rust 導出的結構體會變成具有單一 ptr 屬性的 JavaScript 類別。所有其他屬性都實作為 getter,在呼叫 toJSON 時不會顯示。

inspectable 屬性可以用於 Rust 結構體上,以提供顯示所有可讀取欄位的 toJSONtoString 實作。例如


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen(inspectable)]
pub struct Baz {
    pub field: i32,
    private: i32,
}

#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(constructor)]
    pub fn new(field: i32) -> Baz {
        Baz { field, private: 13 }
    }
}
#}

提供如下 JavaScript 片段中的行為

const obj = new Baz(3);
assert.deepStrictEqual(obj.toJSON(), { field: 3 });
obj.field = 4;
assert.strictEqual(obj.toString(), '{"field":4}');

可以根據需要覆寫其中一個或兩個實作。請注意,產生的 toString 會在內部呼叫 toJSON,因此覆寫 toJSON 會對其輸出產生副作用。


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
impl Baz {
    #[wasm_bindgen(js_name = toJSON)]
    pub fn to_json(&self) -> i32 {
        self.field
    }

    #[wasm_bindgen(js_name = toString)]
    pub fn to_string(&self) -> String {
        format!("Baz: {}", self.field)
    }
}
#}

請注意,console.log 的輸出將保持不變,並且在瀏覽器中僅顯示 ptr 欄位。建議在這些情況下呼叫 toJSONJSON.stringify,以協助記錄或偵錯。Node.js 不受此限制,請參閱下面的章節。

Node.js 中的 inspectable 類別

當使用 nodejs 目標時,會額外提供一個 [util.inspect.custom] 實作,該實作會在內部呼叫 toJSON。此方法用於 console.log 和類似的函式,以顯示 Rust 結構體的所有可讀取欄位。