【问题标题】:Extending nw.gui functionality in Node.js Module在 Node.js 模块中扩展 nw.gui 功能
【发布时间】:2014-07-28 04:16:39
【问题描述】:

所以我正在构建一个节点模块以与 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 模块添加新的原型方法,而无需在构造函数中进行。有人吗?

【问题讨论】:

    标签: javascript node.js webkit node-webkit


    【解决方案1】:

    我绝不是专家,但根据我通过阅读其源代码对 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 类型的原型。

    【讨论】:

    • 是的,它说不要更改 UI 类型的原型。但我决定添加功能,这是值得的。使用我在问题中概述的技术,请参阅github.com/dylangattey/node-webkit-additions 了解我是如何做到的。不是最漂亮的解决方案,但它确实有效。
    • Dylan,虽然您确实添加了有用的功能,但开发人员明确表示修改原型是个坏主意。我会联系他们找出原因。至少,我会将开发人员的警告通知您模块的用户,以便他们在发生意外错误时做好更好的准备。
    • 好主意。我会这样做的
    • 您可能会考虑的另一件事,而不是扩展 njs-wk 的内在对象,是通过适配器类提供您的新功能。见en.m.wikipedia.org/wiki/Adapter_pattern
    猜你喜欢
    • 2015-12-20
    • 2011-09-25
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多