3

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

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

Y当我认为是由库创建的全局可用的 YUI 实例时,它可以完美地工作(如您所料) 。当您使用模块加载器并传递回调时,它不起作用:

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

我花了一段时间研究 YUI 源代码,但到目前为止还没有弄清楚上DifferentY一个示例中的创建位置和方式(以及扩展DifferentY.Node的创建位置)。

我以前从未使用过 YUI,所以我可能会以完全错误的方式处理这个问题。

4

2 回答 2

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... 
});

因此,如果您想“从外部”增强 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]
  });
}

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

YUI().use('node-enhancement'), function(Y) {
    // just use YUI as allways
});

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

于 2013-10-09T21:37:19.940 回答
0

这是猴子修补技术的使用示例。

在此处查看控制台输出:http: //jsfiddle.net/jslayer/XmF6L/

YUI.add('node-custom-module', function(Y){
    console.warn('Override Y.Node');

    Y.Node.YOUR_NODE = 'custom Node';
});

YUI.add('widget-custom-module', function(Y){
    console.warn('Override Y.Widget');

    Y.Widget.YOUR_WIDGET = 'custom Widget';
});

YUI.GlobalConfig = {
    modules : {
        'node-custom-module' : {
            condition : {
                name    : 'node-custom-module',
                trigger : 'node',
                test    : function(){
                    return true;
                }
            }
        },
        'widget-custom-module' : {
            condition : {
                name    : 'widget-custom-module',
                trigger : 'widget',
                test    : function(){
                    return true;
                }
            }
        }
    }
};

YUI().use('node', function(Y) {
    console.group('Node');
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE);
    console.groupEnd('Node');
});

YUI().use('widget', function(Y) {
    console.group('Widget');
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE);
    console.log('Y.Widget.YOUR_WIDGET : ', Y.Widget.YOUR_WIDGET);
    console.groupEnd('Widget');
});

当然没有必要使用YUI.GlobalConfig.

此外,在配置中使用groupshttp://yuilibrary.com/yui/docs/yui/loader.html)也很舒服YUI

groups : {
  patches : {
    modules : {
      /* Define your mp modules here */
    }
  }
}
于 2013-10-23T16:05:13.997 回答