你能修补YUI模块的方法吗?

Jam*_*ice 3 javascript yui yui3

在YUI3中是否可以覆盖例如Node模块的方法?例如,我想做这样的事情:

Y.Node.prototype.get = function () {
    // Do some stuff then call the original function
};
Run Code Online (Sandbox Code Playgroud)

这是完美的(正如您所期望的)什么时候Y是我认为是由库创建的全局可用的YUI实例.使用模块加载器并传递回调时,它不起作用:

YUI().use("*", function (DifferentY) {
    DifferentY.Node.prototype.get === Y.Node.prototype.get; // false
});
Run Code Online (Sandbox Code Playgroud)

我花了一些时间挖掘YUI源代码,但到目前为止还没有弄清楚在DifferentY前面的例子中创建的位置和方式(以及扩展,DifferentY.Node创建的位置).

我之前从未使用过YUI,所以我可能会以完全错误的方式解决这个问题.

nyf*_*lix 5

好的如果我看一下这个例子似乎对Y有误解.在YUI3中,每个东西都是沙箱,所以你可以同时运行多个YUI实例.Y不是全局变量,它将在您调用YUI().use方法时实例化,并且仅存在于该函数内.这就是为什么在SO的代码中只存在DifferentY,而不是Y.

YUI().use('node', 'event', function (Y) {
    // The Node and Event modules are loaded and ready to use.
    // Y exists in here... 
});
Run Code Online (Sandbox Code Playgroud)

因此,如果你想"从外部"增强YUI,我将建立在YUI的模块策略上并使用YUI.add()创建一个YUI模块

if (YUI) {
  YUI.add('node-enhancement', function (Y) {
    Y.Node.prototype.get = function () {
      // Do some stuff then call the original function
    };
  }, '0.0.1', {
    requires: [Node]
  });
}
Run Code Online (Sandbox Code Playgroud)

并让开发人员将增强功能加载为模块(无论如何,他将如何使用yui3)

YUI().use('node-enhancement'), function(Y) {
    // just use YUI as allways
});
Run Code Online (Sandbox Code Playgroud)

有关全局YUI对象如何工作的解释,此概述可能会有所帮助:http://yuilibrary.com/yui/docs/yui/