gpt4 book ai didi

Javascript - 对 parent 的 parent 打电话 super ?

转载 作者:行者123 更新时间:2023-11-29 19:14:34 26 4
gpt4 key购买 nike

我已经在 Odoo 中定义了当前自定义 javascript View 的扩展:

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")
},
});
};

现在为了更好的表示,我在 QuickAddListViewListView 中添加了控制台日志,它们是使用 _super 调用的父级。

所以如果我这样运行它,我会得到这些打印件:

'ListView init'  // This is parent of QuickAddListView
'QuickAddListView Init'
'QuickAddListView modified init'

构造函数的顺序是这个View -> ListView -> 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()

最佳答案

Is there a way in javascript to specify exact parent you want to call?

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

So instead of calling that everything is in a chain, it would start from where you specify? And directly call ListView and skip QuickAddListView original init.

对于那种情况,你只需要替换这条线

this._super.apply(this, arguments);

通过

instance.web.ListView.prototype.init.apply(this, arguments);

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

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

关于Javascript - 对 parent 的 parent 打电话 super ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36370790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com