我正在尝试创建一个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);