Javascript 你能为YUI模块提供补丁吗?

Javascript 你能为YUI模块提供补丁吗?,javascript,yui,yui3,Javascript,Yui,Yui3,在YUI3中,是否可以覆盖来自节点模块等的方法?例如,我想做这样的事情: Y.Node.prototype.get = function () { // Do some stuff then call the original function }; 如果Y是全局可用的YUI实例,我认为它是由库创建的,那么这就非常有效(正如您所期望的)。当您使用模块加载器并传递回调时,它不起作用: YUI().use("*", function (DifferentY) { Different

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

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源代码,但到目前为止,还没有弄清楚上一个示例中的
differentity
是在哪里以及如何创建的(通过扩展,在哪里创建
differentity.Node


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

好吧,如果我看这个例子,似乎对Y有误解。在YUI 3中,每件事都是沙盒,因此可以同时运行多个YUI实例。Y不是全局变量,它将在调用YUI()时实例化。请使用方法,并且仅存在于该函数中。这就是为什么在《圣经》中只存在差异,而不存在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模块

让开发人员将增强作为一个模块加载(他将如何使用yui3)


对于全局YUI对象如何工作的解释,此概述可能会有所帮助:

这里是monkey patching技术的使用示例

在此处查看控制台输出:

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

此外,在
YUI
config中使用
()也很方便

groups : {
  patches : {
    modules : {
      /* Define your mp modules here */
    }
  }
}

谢谢,这绝对有道理。让我困惑的是
YUI
实例在
use
回调之外的明显可用性:@JamesAllardice YUI对象是全局的(它既是一个对象又是一个函数),但YUI的每个实例都被分配给Y变量,该变量被传递给函数,该函数是.use语句的最后一个参数。Y实例只分配了您在.use调用中指定的模块。@Kris-在我链接到的fiddle中有一个全局可用的
Y
对象,它似乎是
YUI
的实例。如果您打算使用
use
调用,那么这是从哪里来的,又有什么意义呢?@James Y对象是由JSFiddle创建的,它将您的所有YUI代码封装在Y.use('node',function(Y){…})中;
YUI().use('node-enhancement'), function(Y) {
    // just use YUI as allways
});
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');
});
groups : {
  patches : {
    modules : {
      /* Define your mp modules here */
    }
  }
}