Javascript覆盖方法并保持相同吗?

时间:2017-03-21 12:38:09

标签: javascript function decorator jupyter-notebook overwrite

我想覆盖一个函数,它是一个Object原型的方法。此方法在内部使用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);
};

2 个答案:

答案 0 :(得分:0)

我现在用bind做了。 return语句变为:

return original_execute_cells.bind(Jupyter.notebook)(cell_indices);

Jupyter.notebook在我的特定情况下,对象thisNotebook对象构建时相关。

然而,@ 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);
};