javascript - 通过覆盖更改继承

标签 javascript inheritance extjs extjs4

我想稍微改变现有的继承结构,插入另一个自定义编写的层。给出以下继承:

Ext.define('ThirdPartyLib.panel.GridPanel',{
    extend:'Ext.grid.Panel',
    initComponent:function() {
        ...
    }
});

Ext.define('MyApp.view.MyGridView',{
    extend:'Ext.grid.Panel',
    initComponent:function() {
        ...
    }
});

Ext.define('MyApp.view.MySpecialGridView',{
    extend:'MyApp.view.MyGridView',
    initComponent:function() {
        ...
    }
});

现在我想更改第三方库以使用我的父类,因此我自己的 initComponent 也会被执行:

Ext.define('MyApp.override.MyGridView',{
    override:'ThirdPartyLib.panel.GridPanel',
    extend:'MyApp.view.MyGridView'
});

这不起作用。如果我立即在 ThirdPartyLib 代码中更改它,它就会起作用:

Ext.define('ThirdPartyLib.panel.GridPanel',{
    extend:'MyApp.view.MyGridView'
});

但是只要有新版本的第三方库可用,这就会中断。

Ext.Class.mixins 确实允许将新函数混合到旧类中,但我无法覆盖 initComponent。

有什么想法吗?

最佳答案

由于您使用的是 Ext JS 4,从技术上讲,您可以通过以下技巧实现这一点:

Ext.define('', Ext.apply(ThirdPartyLib.panel.GridPanel.prototype, {
    extend: 'MyApp.view.MyGridView'
}));

查看实际操作:https://fiddle.sencha.com/#fiddle/spf

请注意,它在 Ext JS 5 或更高版本中不起作用。

一个干净且可持续的解决方案是将您的自定义内容从 initComponent 移至 mixin,覆盖 ThirdPartyLib.panel.GridPanel 并在覆盖的内容中调用 mixin 的方法initComponent

关于javascript - 通过覆盖更改继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32202819/

相关文章:

javascript - Bootstrap : hide drop down menu when mobile and link to parent

c# - 将 B 添加到 List<A<object>>,其中 B 使用值类型实现 A

javascript - 使 javascript 函数更短

javascript - Extjs 将按钮在容器中居中对齐

javascript - Angular 图不像文档那样在顶部显示系列

javascript - Intl.Collat​​or 对日语进行排序 - 为什么 collat​​or 不首先优先考虑日语字符?

C++ 继承 : scoping and visibility of members

php - Uploadify 的动态响应函数

Javascript 表单输入值与输入最大值的比较

c++ - 不同类型的复合模式重用