inspectable
預設情況下,從 Rust 匯出的結構體會變成具有單個 ptr
屬性的 JavaScript 類別。所有其他屬性都實作為 getter,這些 getter 在呼叫 toJSON
時不會顯示。
inspectable
屬性可以用於 Rust 結構體,以提供顯示所有可讀取欄位的 toJSON
和 toString
實作。例如
#![allow(unused)] 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)] 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 結構體的所有可讀取欄位。