所以我构建了一个与node-webkit一起使用的节点模块,用于创建一个新对象并将其导出。标准票价。但since Node has no access to the nw-gui
module of node-webkit,我只是将其作为参数传递给构造函数。像这样:
function Example(gui) {
this.gui = gui; //Save for later
}
Example.prototype.createExampleMenu = function() {
return new this.gui.Menu();
}
exports.example = Example;
效果很好。但我尝试修改node-webkit内部模块的.prototype
方法,例如Menu
和MenuItem
。是在构造函数本身中修改这些方法(或添加新方法)的唯一方法吗?如果我尝试在外部添加新的原型方法,它(显然)会失败,因为this.gui
尚未设置。基本上,我试图更好地将新的原型方法添加到node-webkit模块而不在构造函数中执行它。任何人吗?
答案 0 :(得分:0)
我不是专家,但从我对node-webkit的实现的理解中读取其源代码,我怀疑你可以修改nw.gui
中定义的任何对象。
如果你看一下正在运行的node-webkit实例中Node的标准require
函数的实现,你会发现:
function (name) {
if (name == 'nw.gui')
return nwDispatcher.requireNwGui();
return global.require(name);
}
这意味着nw.gui
的要求确实非常特殊。
这不是要求JavaScript代码,而是返回一个内部二进制对象,它只是一个必需的库。
再深入一点,我们发现nwDispatcher.nwGui.Menu被定义为:
function Menu(option) {
if (typeof option != 'object')
option = { type: 'contextmenu' };
if (option.type != 'contextmenu' && option.type != 'menubar')
throw new String('Invalid menu type: ' + option.type);
this.type = option.type;
v8_util.setHiddenValue(this, 'items', []);
nw.allocateObject(this, option);
}
调用nw
对象的方法,该对象是在此函数之外不可用的对象(即该函数充当其上的闭包。)
对nw.gui.Menu
的各种原型方法的进一步检查表明,每次调用都会(在内部)引用此nw
对象来处理对内部定义函数的方法调度(用C ++编写)。
因此,nw.gui
模块不是一组标准的JavaScript原型对象,而是调用node-webkit运行时内部的二进制函数,这些函数不通过其定义的API公开。
请勿更改UI类型的原型。