在 class 定义中使用后无法覆盖混合行为
cannot override mixin behavior after it's used in a class definition
我需要覆盖一些由来自第 3 方库的 mixin 添加的成员函数。问题是:mixin 立即用于多个第 3 方 class 定义,在定义 mixin 的同一个脚本文件中。而且我只能在此脚本之前或之后插入自定义代码,而不能在两者之间插入。如果我之后调用 override
,那么已经定义的 classes 不会在调用链中获取我的函数。
// library script BEGIN
Ext.define('Foo.bar.Base', {
});
Ext.define('Foo.bar.Util', {
newmember: function() {
console.log('newmember');
}
});
Ext.define('Foo.bar.Derived', {
extend: 'Foo.bar.Base',
mixins: {
fooutil: 'Foo.bar.Util'
}
});
// library script END
Foo.bar.Util.override({
newmember: function () {
console.log('newmember2');
this.callParent();
}
});
var obj = new Foo.bar.Derived();
obj.newmember();
实际输出:
newmember
期望的输出:
newmember2
newmember
在使用混入定义 class 之前重写。这可以在定义时使用 override 作为 属性 来完成:
Ext.define('Foo.bar.UtilOverride',{
override: 'Foo.bar.Util',
newmember: function () {
console.log('newmember2');
this.callParent();
}
});
// library script BEGIN
Ext.define('Foo.bar.Base', {
});
Ext.define('Foo.bar.Util', {
newmember: function() {
console.log('newmember');
}
});
Ext.define('Foo.bar.Derived', {
extend: 'Foo.bar.Base',
mixins: {
fooutil: 'Foo.bar.Util'
}
});
// library script END
var obj = new Foo.bar.Derived();
obj.newmember();
我需要覆盖一些由来自第 3 方库的 mixin 添加的成员函数。问题是:mixin 立即用于多个第 3 方 class 定义,在定义 mixin 的同一个脚本文件中。而且我只能在此脚本之前或之后插入自定义代码,而不能在两者之间插入。如果我之后调用 override
,那么已经定义的 classes 不会在调用链中获取我的函数。
// library script BEGIN
Ext.define('Foo.bar.Base', {
});
Ext.define('Foo.bar.Util', {
newmember: function() {
console.log('newmember');
}
});
Ext.define('Foo.bar.Derived', {
extend: 'Foo.bar.Base',
mixins: {
fooutil: 'Foo.bar.Util'
}
});
// library script END
Foo.bar.Util.override({
newmember: function () {
console.log('newmember2');
this.callParent();
}
});
var obj = new Foo.bar.Derived();
obj.newmember();
实际输出:
newmember
期望的输出:
newmember2
newmember
在使用混入定义 class 之前重写。这可以在定义时使用 override 作为 属性 来完成:
Ext.define('Foo.bar.UtilOverride',{
override: 'Foo.bar.Util',
newmember: function () {
console.log('newmember2');
this.callParent();
}
});
// library script BEGIN
Ext.define('Foo.bar.Base', {
});
Ext.define('Foo.bar.Util', {
newmember: function() {
console.log('newmember');
}
});
Ext.define('Foo.bar.Derived', {
extend: 'Foo.bar.Base',
mixins: {
fooutil: 'Foo.bar.Util'
}
});
// library script END
var obj = new Foo.bar.Derived();
obj.newmember();