Javascript - 对父母调用 super 父母?

And*_*ius 3 javascript super odoo odoo-8

我在 Odoo 中定义了当前自定义 javascript 视图的扩展:

openerp.account_move_journal_test = function(instance){
    var _t = instance.web._t,
        _lt = instance.web._lt;
    var QWeb = instance.web.qweb;
    instance.web.account.QuickAddListView.include({
        init: function(){
            this._super.apply(this, arguments);
            console.log("QuickAddListView modified init")
        },
    });    
};
Run Code Online (Sandbox Code Playgroud)

现在,为了更好地表示,我添加了控制台登录QuickAddListView和 in ListView,它们是称为 using 的父级_super

因此,如果我像这样运行它,我会得到这些打印结果:

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView Init'
'QuickAddListView modified init'
Run Code Online (Sandbox Code Playgroud)

构造函数的顺序是这样的View-> ListView->QuickAddListView

因此,所有这些都按应有的方式打印,但我想要的是以init直接调用ListView并跳过QuickAddListView原始init.

所以之后它应该只打印这个(意味着原始的 QuickAddListView init 没有被调用):

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView modified init'
Run Code Online (Sandbox Code Playgroud)

javascript 有没有办法指定您想要调用的确切父级?因此,不是称一切都在链中,而是从您指定的位置开始(就像我的情况一样ListView)?

例如,在 Python 中你可以这样做:

from some_module import SomeBaseClass

class CustomBase(SomeBaseClass):
    def m1(self):
        super(CustomBase, self).m1()

class Custom(CustomBase):
    def m1(self):
        # skip CustomBase
        super(CustomBase, self).m1() 
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 5

javascript 有没有办法指定您想要调用的确切父级?

是的,您几乎已经这样做了:使用来显this._super式引用 的方法。QuickAddListViewinit

因此,不是说一切都在链中,而是从您指定的位置开始?并直接调用ListView并跳过QuickAddListView原来的init

对于这种情况,您只需更换线路

this._super.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

经过

instance.web.ListView.prototype.init.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

(或者你可以访问该类,但不确定 Odoo)

请注意,这是绝对的反模式。如果你想继承自QuickAddListView,你应该运行它的构造函数(或init方法),以便它可以初始化它需要的属性。如果您出于某种原因不想这样做,您可能不应该继承它,而应该ListView直接继承。