inspectable
預設情況下,從 Rust 導出的結構體會變成具有單一 ptr
屬性的 JavaScript 類別。所有其他屬性都實作為 getter,在呼叫 toJSON
時不會顯示。
inspectable
屬性可以用於 Rust 結構體上,以提供顯示所有可讀取欄位的 toJSON
和 toString
實作。例如
# #![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
欄位。建議在這些情況下呼叫 toJSON
或 JSON.stringify
,以協助記錄或偵錯。Node.js 不受此限制,請參閱下面的章節。
Node.js 中的 inspectable
類別
當使用 nodejs
目標時,會額外提供一個 [util.inspect.custom]
實作,該實作會在內部呼叫 toJSON
。此方法用於 console.log
和類似的函式,以顯示 Rust 結構體的所有可讀取欄位。