我想覆盖一个函数,它是一个Object原型的方法。此方法在内部使用this
。如何覆盖该函数但仍将this
定义为与原始函数中相同的对象/值?
我想保留它的原因如下:
以下是一些示例代码:
//original functions
var original_execute_cells = Jupyter.Notebook.prototype.execute_cells;
// decorating functions
function decorated_execute_cells(cell_indices) {
console.log('EXTENSION: running decorated execute_cells function');
return original_execute_cells(cell_indices);
}
// overwrite original functions
Jupyter.Notebook.prototype.execute_cells = decorated_execute_cells;
然而,当我这样做时,我得到一个TypeError
告诉我this
未定义,在原始函数的第一行中使用this
。
我试图覆盖的函数的原始源代码可以在github上找到:
Notebook.prototype.execute_cells = function (indices) {
if (indices.length === 0) {
return;
}
var cell;
for (var i = 0; i < indices.length; i++) {
cell = this.get_cell(indices[i]);
cell.execute();
}
this.select(indices[indices.length - 1]);
this.command_mode();
this.set_dirty(true);
};
答案 0 :(得分:0)
我现在用bind做了。 return语句变为:
return original_execute_cells.bind(Jupyter.notebook)(cell_indices);
Jupyter.notebook
在我的特定情况下,对象this
与Notebook
对象构建时相关。
然而,@ siebetman在评论中提到的内容也可以起作用,甚至可能在某些情况下更灵活。另外,siebetman提供的链接似乎非常有用,以便更好地理解Javascript&#39; this
。
答案 1 :(得分:0)
为什么不只绑定this
?
var original_execute_cells = Jupyter.Notebook.prototype.execute_cells;
Jupyter.Notebook.prototype.execute_cells = function(cell_indices) {
console.log('EXTENSION: running decorated execute_cells function');
return original_execute_cells.bind(this)(cell_indices);
};