structural
Note: As of RFC 5 this attribute is the default for all imported functions. This attribute is largely ignored today and is only retained for backwards compatibility and learning purposes.
The inverse of this attribute, the
final
attribute is more functionally interesting thanstructural
(asstructural
is simply the default)
The structural
flag can be added to method
annotations, indicating that the
method being accessed (or property with getters/setters) should be accessed in a
structural, duck-type-y fashion. Rather than walking the constructor's prototype
chain once at load time and caching the property result, the prototype chain is
dynamically walked on every access.
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { type Duck; #[wasm_bindgen(method, structural)] fn quack(this: &Duck); #[wasm_bindgen(method, getter, structural)] fn is_swimming(this: &Duck) -> bool; } }
The constructor for the type here, Duck
, is not required to exist in
JavaScript (it's not referenced). Instead wasm-bindgen
will generate shims
that will access the passed in JavaScript value's quack
method or its
is_swimming
property.
// Without `structural`, get the method directly off the prototype at load time:
const Duck_prototype_quack = Duck.prototype.quack;
function quack(duck) {
Duck_prototype_quack.call(duck);
}
// With `structural`, walk the prototype chain on every access:
function quack(duck) {
duck.quack();
}