在Node.js模块中扩展nw.gui功能

时间:2014-07-28 04:16:40

标签: javascript node.js webkit node-webkit

所以我构建了一个与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方法,例如MenuMenuItem。是在构造函数本身中修改这些方法(或添加新方法)的唯一方法吗?如果我尝试在外部添加新的原型方法,它(显然)会失败,因为this.gui尚未设置。基本上,我试图更好地将新的原型方法添加到node-webkit模块而不在构造函数中执行它。任何人吗?

1 个答案:

答案 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公开。

更新

来自node-webkit wiki

请勿更改UI类型的原型。