gpt4 book ai didi

javascript - 为什么有时覆盖类函数不起作用?

转载 作者:行者123 更新时间:2023-12-04 09:06:21 25 4
gpt4 key购买 nike

我关注了这个 https://wiki.gnome.org/Projects/GnomeShell/Extensions/StepByStepTutorial用于覆盖函数。
例如,我想重写函数 _setupKeyboard() Keyboard 类,但我的覆盖没有被调用。我要更改的具体部分是这个,删除 if guard :

if (Meta.is_wayland_compositor()) {
this._connectSignal(this._keyboardController, 'emoji-visible',
this._onEmojiKeyVisible.bind(this));
}
我从源代码复制了函数,删除了我不想要的部分,然后像这样设置替换函数:
const Keyboard = imports.ui.keyboard;

Keyboard.Keyboard.prototype._setupKeyboard = myOverride;
为什么我的覆盖没有被调用,我该如何实现?

最佳答案

不会调用覆盖有两个常见原因。如果在应用覆盖之前调用了该方法,或者该函数是使用 Function.prototype.bind() 设置的回调这会创建一个新的闭包。
在这种情况下,函数 _setupKeyboard()在应用覆盖之前调用。当 GNOME Shell 启动时,它会创建一个 Keyboard.KeyboardManager 的实例。 here :

// main.js, line #204
keyboard = new Keyboard.KeyboardManager();
到了 keyboard变量已分配给实例,默认 Keyboard.Keyboard类已创建,函数 _setupKeyboard()已在 Keyboard._init() 中调用,这比加载扩展要快得多。
由于无法轻松解决此问题,因此您最好的选择是重新创建要运行的代码的一部分:
const Meta = imports.gi.Meta;
const Main = imports.ui.main;
const Keyboard = imports.ui.keyboard.Keyboard;


const originalSetup = Keyboard.prototype._setupKeyboard;

const modifiedSetup = function () {
originalSetup.call(this);

if (!Meta.is_wayland_compositor()) {
this._connectSignal(this._keyboardController, 'emoji-visible',
this._onEmojiKeyVisible.bind(this));
}

this._relayout();
};


function init() {
}

// Your extension's enable function (might be a class method)
function enable() {
let kbd = Main.keyboard.keyboardActor;

if (kbd !== null) {
if (!Meta.is_wayland_compositor()) {
kbd.__mySignalId = kbd._connectSignal(kbd._keyboardController, 'emoji-visible',
kbd._onEmojiKeyVisible.bind(kbd));
}
}

Keyboard.prototype._setupKeyboard = modifiedSetup;
}

function disable() {
let kbd = Main.keyboard.keyboardActor;

if (kbd !== null && kbd.__mySignalId) {
kbd.disconnect(kbd.__mySignalId);
kbd.__mySignalId = 0;
}

Keyboard.prototype._setupKeyboard = originalSetup;
}
这不是很漂亮,但这通常是修补私有(private)代码的代价。我也不能保证代码会做你想做的事,因为我怀疑表情符号键隐藏在 X11 上是有原因的。

关于javascript - 为什么有时覆盖类函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63434731/

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