Javascript-在父对象上调用super?

Javascript-在父对象上调用super?,javascript,openerp,odoo-8,super,Javascript,Openerp,Odoo 8,Super,我在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:

我在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")
        },
    });    
};
现在为了更好地表示,我在QuickAddListView和ListView中添加了控制台日志,它们是使用_super调用的父级

如果我这样运行,我会得到这些指纹:

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView Init'
'QuickAddListView modified init'
构造函数的顺序是此视图->列表视图->QuickAddListView

所以所有这些都应该打印出来,但我想要的是修改init,使其直接调用ListView并跳过QuickAddListView原始init

因此,在这之后,它应该只打印此内容,这意味着未调用原始QuickAddListView init:

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView modified init'
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() 
javascript中有没有一种方法可以指定要调用的确切父级

是的,您已经在这样做了:使用这个.\u super显式地引用QuickAddListView的init方法

因此,它不会调用所有内容都在一个链中,而是从您指定的位置开始?直接调用ListView并跳过QuickAddListView原始初始化

在这种情况下,您只需更换线路即可

this._super.apply(this, arguments);

或者,您可以访问该类,但不确定Odoo


但请注意,这是一个绝对的反模式。如果要从QuickAddListView继承,应该运行其构造函数或init方法,以便它可以初始化所需的属性。如果您出于任何原因不想使用它,您可能不应该继承它,而应该直接从ListView继承。

这是从哪里来的。\u super?这通常不起作用。@Bergi你什么意思通常不起作用?它内置于Odoo中,用于继承以模拟继承/扩展,比如Python中的继承/扩展。它只在每次方法调用期间动态设置时起作用,就像您的框架提供的那样;这种方法并不适用于每一个实例,它有点违背结构。但是我想要这个,因为在QuickAddListView中只有很少的函数需要这样修改。对于init,我将重写QuickAddListView中的一些属性,但不是全部,因为我需要跳过一些属性。但对于其他函数,它们的功能应该与原始QuickAddListView中的功能相同,因此我考虑这样做。明天,当我回到我的工作电脑时,我会检查你的答案。我认为你应该调用QuickAddListView,然后手动取消设置/重置/优化你不需要或需要不同的属性。这样一来,你真正在做的事情就更加明确和明显了。对init来说,这并不是什么大不了的事。我真的可以叫QuickAddListView。但对于其他方法,我指的是需要修改的函数,我看不出有什么方法可以做到这一点。我的意思是,如果我从QuickAddListView调用它,那就太晚了。换言之,它将采取我正试图阻止的行动。例如,它将创建/修改一些记录。但如果我直接从ListView调用某个函数,那么我就可以重写在QuickAddListView中要执行的特定操作。不知道我是否解释得很清楚。啊,是的,对于其他方法来说,这没什么大不了的。我试过你的建议,而且很有效。因此,如果有人需要,您应该将instance.web.account.ListView.prototype.init.apply更改为instance.web.ListView.prototype.init.apply,因为这是ListView init的路径。那我就接受你的回答。
instance.web.ListView.prototype.init.apply(this, arguments);