【发布时间】:2017-08-13 03:14:16
【问题描述】:
我想重写一个函数,它是一个对象原型的方法。此方法在内部使用this。如何覆盖该函数但仍将 this 定义为与原始函数中相同的对象/值?
我想保留它的原因如下:
- 原代码支持扩展。我宁愿编写一个扩展并将其添加到原始代码作者所期望的代码中,而不是更改原始代码并构建或安装修改后的版本。
- 在调用原始函数之前,我总是需要执行一些操作。所以我实际上想保留原始功能,但想在它之前添加一些东西。我认为这将是“装饰”函数,就像 Python 中的装饰器一样。
- 我覆盖函数的代码范围与最初定义的范围不同。
下面是一些示例代码:
//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);
};
【问题讨论】:
-
做
original_execute_cells.call(this,cell_indices)
标签: javascript function decorator jupyter-notebook overwrite