在 pluginhost-debug.js 中有段代码:
PluginHost.plug = function(hostClass, plugin, config) {
// Cannot plug into Base, since Plugins derive from Base [ will cause infinite recurrsion ]
var p, i, l, name;
if (hostClass !== Y.Base) {
}
};
其中的if是为了防止在 Y.Base 设置插件。
插件实例初始化:
插件继承于Y.Plugin.Base, 由于 YUI3 的设计 ,Y.Plugin.Base 继承于 Y.Base ,Y.Base 又 augment 自PluginHost 则在 使用插件时,插件需要实例化,实例化时当调用到 Y.Base 的构造函函数:
function Plugin(config) {
//Y.Base
Plugin.superclass.constructor.apply(this, arguments);
}
而 Y.Base的构造函数则会由于augment自PluginHost,调用 _initPlugins 而 _initPlugins 则会取得所有继承链构造器:
var classes = (this._getClasses) ? this._getClasses() : [this.constructor],
即: Y.Base ,Y.Plugin.Base,以及当前插件构造器本身,对这几个构造器的plugins进行实例化,但是如果 Y.Base 有 plugins ,则在初始化 Y.Base的插件时,又会回到本段开头进入无限递归。
由上分析可知,确实不可以对 Y.Base 进行plug ,但是同时也看到也不能对 Y.Plugin.Base以及插件构造器进行 plug,原因同上,但是 YUI3只考虑了不可以对 Y.Base进行 if判断,却没有对Y.Plugin.Base以及插件构造器本身进行判断,修正如下:
if (hostClass !== Y.Base) {
var original=hostClass;
//plugin.Base的子类都不能
while(hostClass){
if(hostClass == Y.Plugin.Base) return;
if(hostClass.superclass)hostClass=hostClass.superclass.constructor;
else break;
}
hostClass=original;
}
测试代码:
若没有上步修正会导致无限递归
YUI({
filter:"DEBUG"
}).use("base","event","node","event-simulate","event-custom","node-event-simulate","plugin","oop","pluginhost",function(Y){
function testPlugin(){
testPlugin.superclass.constructor.call(this);
console.log("testPlugin ...");
}
Y.extend(testPlugin,Y.Plugin.Base);
testPlugin.NAME="testPlugin";
testPlugin.NS="testPlugin_ns";
//plug Y.Plugin.Base
Y.Plugin.Host.plug(Y.Plugin.Base,testPlugin);
//plug自身
Y.Plugin.Host.plug(testPlugin,testPlugin);
Y.Node.plug(testPlugin);
//开始无限递归
var node=Y.one("body");
console.log("done");
});
分享到:
相关推荐
**yuicompressor-maven-plugin详解** `yuicompressor-maven-plugin`是一款强大的Maven插件,主要用于优化前端资源,特别是JavaScript和CSS文件。这个插件是基于YUI Compressor,一个由Yahoo开发的开源工具,它能...
标题中的"struts2 yahoo yui ajax plugin"指的是一个特定的插件,这个插件将Yahoo YUI库与Struts2框架整合,以支持使用Ajax技术进行异步数据交互。这个插件允许开发者利用YUI的强大的JavaScript功能来增强Struts2...
"eclipse yuicompressor-maven-plugin"是Maven生态系统中的一个插件,专门用于这个目的。下面将详细阐述这个插件的功能、用法以及它在Maven项目中的应用。 ### 1. Maven简介 Maven是一个强大的项目管理和综合工具,...
yuicompressor-maven-plugin, 用于压缩 (Minify/Ofuscate/Aggregate) Javascript文件和使用 YUI 压缩器的CSS文件的Maven 插件 [[Flattr this git repo] ( http://api.flattr.com/button/flattr-badge-large.png)]...
《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...
这篇博文“YUI3 中tree的两种实现”探讨了如何在YUI3中创建和管理树形结构。 1. **YUI3 TreeView组件** YUI3 TreeView组件是YUI3核心库的一部分,它允许开发者创建交互式的树结构。这个组件支持节点的添加、删除、...
**YUI3 Dialog组件详解** YUI3是Yahoo!推出的一款强大的JavaScript库,它提供了丰富的UI组件和工具,用于构建高性能、跨平台的Web应用程序。Dialog组件是YUI3中的一个重要部分,它允许开发者创建可交互的弹出窗口,...
在实际使用YUI 3.17.2时,开发者可以通过`yui3-3.17.2`这个压缩包文件获取所有必要的资源。这个压缩包中包含了库的源码、示例、文档和其他辅助工具。开发者可以按照项目需求,选择合适的模块和组件进行集成。 在...
从YUI2到YUI3看前端的演变
YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...
Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。
1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...
**YUI3简介** YUI(Yahoo! User Interface Library)是雅虎公司开发的一个开源JavaScript库,主要用于构建富互联网应用程序(RIA)。YUI3是YUI的第三个主要版本,它在设计时注重模块化、可扩展性和性能优化,提供了...
3. **事件处理**:YUI的事件系统强大,支持事件绑定、解绑、事件冒泡等,使得用户交互编程简单易行。 4. **动画效果**:通过Transition和Anim模块,可以轻松实现平滑的CSS3动画和JavaScript动画效果。 5. **数据绑定...
1. **模块系统**:YUI3引入了CommonJS风格的模块系统,允许开发者通过`YUI.use()`方法加载所需模块,实现按需加载,减少页面初始化时的加载量。 2. **事件处理**:YUI3提供了强大的事件系统,支持DOM事件、自定义...
1. **YUI 3.0架构**:YUI 3采用了模块化设计,允许开发者按需加载组件,降低了页面加载时间。每个模块都有独立的命名空间,避免了全局变量污染。 2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果...
### YUI3 Cookbook知识点概述 #### 一、YUI3简介 YUI3(Yahoo User Interface Library Version 3)是雅虎开发的一款免费开源的JavaScript库,它为开发者提供了丰富的前端开发工具,包括动画效果、事件处理、DOM操作...
### YUI3中文文档知识点详解 #### YUI3概述及YUIGlobal对象介绍 **YUI3** 是一个开源的JavaScript库,旨在提供一系列工具和API,帮助开发者构建高性能、高质量的Web应用。YUI3的核心优势在于其模块化的设计、强大...
《深入理解YUI:基于“yui.rar 例子”的解析》 YUI,全称Yahoo! User Interface Library,是雅虎公司推出的一款开源JavaScript库,旨在帮助开发者构建高性能、易于维护的网页应用。本篇文章将结合“yui.rar 例子”...