我正在尝试创建一个Postbox插件(Postbox是基于Thunderbird的邮件客户端),但是我遇到了一个小问题。我远不是Java语言专家,而且我无法理解其背后的问题...

我正在尝试从Postbox代码扩展一些对象功能。代码很大,因此我尝试创建一个小示例来演示我的问题。以下代码是原始Postbox代码结构的示例:

FolderTreeView.prototype = {

    init: function FTV__init() {
        alert("init");
    },

    _ensureValidRow: function FTV__ensureValidRow(aRow) {
        alert("_ensureValidRow");
    },

    getCellProperties: function FTV_getCellProperties(aRow, aColumn, aProperties) {
        this._ensureValidRow(aRow);
    }

}

function FolderTreeView() {
    this._tree = null;
    this.init();
}

var gFolderView = new FolderTreeView();


我无法更改此代码的原因,因为在更新Postbox时,该代码将还原为原始源,因此很难维护它。

以下是我自己的代码,试图扩展getCellProperties函数:

MyExtension = {

    init: function() {
        MyExtension.FolderIcon.load();
    },

    FolderIcon: {
        load: function() {
            var oGetCellProperties = gFolderView.getCellProperties;

            gFolderView.getCellProperties = function FTV_getCellProperties(aRow, aColumn, aProperties) {
                oGetCellProperties(aRow, aColumn, aProperties);
            }

            gFolderView.getCellProperties(null, null, null);
        }
    }

}


现在,oGetCellProperties正在调用原始函数,该函数依次尝试调用this._ensureValidRow,但失败。错误控制台报告:

this._ensureValidRow is not a function

最佳答案

a.b()this中的b值设置为a。保存它不会:

a.b(); // sets `this` value inside `b` to `a`

var c = a.b;

c(); // does *not* set `this` value inside `b` to `a`


所以你有:

var oGetCellProperties = gFolderView.getCellProperties;
// gFolderView is lost as `this` value


您宁愿要.bind.bind仅在较新的浏览器中可用,但对于较旧的浏览器有shims

var oGetCellProperties = gFolderView.getCellProperties.bind(gFolderView);
// force `this` value


或者您可以在每次调用时使用this设置.call值:

//                      `this`       argument1, ...
oGetCellProperties.call(gFolderView, aRow,      aColumn, aProperties);

09-11 19:19