# 扩展和混入
扩展是在块初始化时执行的函数,常用于给块增加自定义配置或行为。
混入用于给块增加属性或辅助函数,但不会在注册时立即执行。
只有在你使用 JSON 定义块时,才需要扩展或混入。
如果你使用 JavaScript 定义块,则可直接在 init 中调用初始化逻辑,并把方法或属性直接挂到定义对象上。更多可见 JSON 和 JavaScript。
# 扩展
扩展会在每个对应类型的块实例创建时执行。常见用途包括:
- 添加自定义配置(如动态 tooltip)
- 添加自定义行为(如事件监听)
// 这个扩展会把当前块的 tooltip 设置为父块的 tooltip(如果存在)。
Blockly.Extensions.register(
'parent_tooltip_extension',
function() { // this 指向正在执行扩展的块
var thisBlock = this;
this.setTooltip(function() {
var parent = thisBlock.getParent();
return (parent && parent.getInputsInline() && parent.tooltip) ||
Blockly.Msg['MATH_NUMBER_TOOLTIP'];
});
});
扩展需要先注册成字符串键,再在块的 JSON 定义中通过 extensions 属性引用。
{
// ...,
"extensions": ["parent_tooltip_extension"],
}
可以一次应用多个扩展。注意 extensions 必须是数组,即使只有一个扩展也一样。
{
// ...,
"extensions": ["parent_tooltip_extension", "break_warning_extension"],
}
# 混入
如果你只是想给块添加一些属性或辅助函数,而不需要立刻执行逻辑,可以使用混入。
做法是注册一个 mixin 对象;当该块类型实例化时,Blockly 会把这个对象混入块实例。
Blockly.Extensions.registerMixin('my_mixin', {
someProperty: 'a cool value',
someMethod: function() {
// Do something cool!
},
});
混入注册后的字符串键,和普通扩展一样,也是在 JSON 的 extensions 中引用:
{
// ...,
"extensions": ["my_mixin"],
}