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 结构体的所有可读字段。