`
decentway
  • 浏览: 159174 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

YUI3:Base

阅读更多

Base类被设计成基础类,YUI库中attribute-base和event target-base的类都衍生自Base类。Base类为在YUI、库中创建的attribute-base类提供统一的模板。Base类还提供统一的init()和destroy()序列,来串联类层级中的初始化(initializer)和销毁(destructor)方法。

Base类还通过插件或扩展的方式,提供代码重用的方法。

使用Base功能

以下部分详细讲解如何使用Base功能。包含以下内容:

  • 扩展Base类
  • 静态属性NAME属性和ATTRS属性
  • 初始化和销毁
  • 扩展

扩展Base类

虽然Base类可以被实例化,但是它被设计成基类,用以创建基于Attribute和EventTarget的类。如下:

YUI.use(“base”,function(Y){
	function MyClass(config){
		MyClass.superclass.constructor.apply(this,arguments)
}
	Y.extend(MyClass,Y.Base,{});
})

Base类扩充自Attribute类,而Arribute类又扩充自EventTarget类。因此,Base类具有Attibute功能,也是一个事件目标(Event Target)。

Base的构造器接收一个字面量对象,该字面量对象在构造的过程中用来设置属性的初始值。

静态属性

Base类查找两个静态属性,在类的构造器中必须包含这两个静态属性。在为类设置事件和属性时会使用到这两个静态属性。

YUI.use(“base”,function(Y){
	function MyClass(config){
		MyClass.superclass.constructor.apply(this,arguments)
}
MyClass.NAME = “myclass”;
MyClass.ATTRS = {};
	Y.extend(MyClass,Y.Base,{});
})
NAME

NAME属性是用来标识类的字符串。

NAME属性的一个重要用途是用作类实例所发布事件的前缀。比如,由MyClass类实例发布的事件有myClass前缀。前缀约定为类名的驼峰拼写法。

触发自不同类实例、有着相同名字的事件在冒泡或广播时,事件的前缀保证他们的唯一性和可识别性。比如:在某个Menu widget上的click事件,可以通过订阅menu:click事件来辨别;一个Editor的click可以通过editor:click来识别。因为YUI3.x的自定义事件可以冒泡,这样的前缀允许你在一个更高的层面监听来自不同类的事件。也就是说,你可以像在普通的事件目标上监听一样,使用事件代理。例子:

MyClass.prototype.doSometing = function(){
	this.fire(“enabled”);
}
var o = new MyClass(cfgs);
o.on(“enabled”,function(){});
o.on(“myClass:enabled”,function(){});

NAME属性还在Base的toString的默认实现中使用。

ATTRS

ATTRS属性时一个关联数组(一个有属性/值对的对象),用以定义类实例的默认属性。类层级中的每一个类都定义一组属性以及相应的支持代码,类实例会包含类层级中定义的所有属性。

以下是Drag类中定义的一组属性(部分):

Drag.ATTRS = {

    node: {
        setter: function(node) {
            var n = Y.one(node);
            if (!n) {
                Y.fail('DD.Drag: Invalid Node Given: ' + node);
            }
            return n;
        }
    },

    dragNode: {
        setter: function(node) {
            var n = Y.one(node);
            if (!n) {
                Y.fail('DD.Drag: Invalid dragNode Given: ' + node);
            }
            return n;
        }
    },

    offsetNode: {
        value: true
    },

    clickPixelThresh: {
        value: DDM.get('clickPixelThresh')
    },

    ...

}; // End of Drag.ATTRS associative array (object literal)

对象字面量中的每一个属性,定义了增加的属性名,以及对应的属性值。更多关于如何构建配置对象请查看Attribute’s discussion of configuration properties。

当初始化一个衍生自Base的类时,Base类的init方法会初始化类层级中每一个类的ATTRS属性定义的属性。这避免在每一个类的constructor/initializer中重复定义属性初始化的代码。

Base类还定义了一个属性初始化顺序,从Base类,到子类。在一个类,ATTRS中定义的属性的顺序是无关紧要的。如果ATTRS中的一个属性在初始化时,需要用到ATTRS后面定义的属性,后面定义的属性会按照需要初始化。

值得注意的是,因为性能方面的原因,Base类惰性地添加或初始化属性。意思是说直到调用set或get方法时,属性才会被初始化。可以通过改变该属性的alazyAdd属性为false,来覆盖默认的惰性行为。(比如某属性的setter方法被用于设置对象中的其他非attribute状态。)

初始化与销毁

Base类实现init和destoy方法,用以建立初始化与销毁这两个生命周期。init方法和destroy方法是不会被Base的子类继承的。扩展自Base类的类通过定义原型级别(prototype-level)的initializer和destructor方法, 可以进行 初始化和销毁操作。如下:

Y.extend(MyClass,Y.Base,{
	initializer:function(cfg){},
	destructor:function(){}
});

Base的init方法和destroy方法负责调用类层级中的initializer方法和destructor方法。每一个类的方法实现不需要调用父类中该方法的实现。Base类确保初始化和销毁过程,根据类的层级按照固定的顺序执行。

initializer()

Base的构造器调用的init方法, 会为类层级中的每一个类调用initializer方法,次序是从Base类开始到当前被初始化的子类。每一个类的initializer方法会在类的属性被初始化后调用。initializer方法会接收到属性初始化后提供的配置对象。该对象是通过init方法传递给initializer方法的。

destructor

Base的destroy方法被调用时,会执行类层级中每一个类的destructor方法。从被实例化创建该实例的子类到Base类。与初始化的顺序相反。

如果你的类在init或destroy过程中,不需要进行任何操作,你就不需要在该类的原型中定义initializer方法和destructor方法。

插件

插件功能可以向衍生自Base类的类实例中添加功能,而不需要把功能写到核心类中。这样的功能允许类实例们混合多种功能,而不需要把这些功能写到一个庞大的类中,或者是为同一序列的功能衍生出很多类。

Plugin.Host类向Base类中添加以下主要方法:

plug(plugClass,plugConfig);

往实例中添加插件与插件配置。plug方法实例化一个插件实例,添加到现有的实例的命名空间(属性)上,该属性名在插件类的NS属性中定义。

plug方法还可以通过数组的方式一次添加多个插件,如下:

instance.plug([{fn:AnimPlug,cfg:{duration:2}},{fn:AnimPlug,cfg:{duration:2}}]);
unplug(plugClass)或unplug(namespace)

从实例中移除插件并将插件销毁。

这两个方法在一个插件实例被创建后,才能使用。还可以在实例化的过程中,通过plugins属性,为实例添加插件,如下:

var overlay = new Overlay({
	srcNode:”#module”,
	plugins:[{fn:AnimPlug,cfg:{duration:2}}]
});

另外,如果组件开发者希望他的组件中默认添加一些插件,Base.plug方法和Base.unplug方法提供这样的接口,让开发者在类定义中默认添加这些插件。

关于插件的开发见Plugin landing page,Widget IO Plugin, Overlay IO Plugin and Overlay Animation Plugin是插件的好例子。

“MyPlugin” template file 提供插件开发的模板。这个模板是通过衍生Plugin.Base类创建插件类的。

扩展

Base类提供一个静态的build方法,通过将一个主类和一个或多个扩展类组合来创建自定义类。

扩展类与插件相似,他们把特定功能的实现封装在扩展类中。但是,扩展是在类的级别上扩展,创建新的类,而插件是在实例的级别上扩展实例。

BUILD

build方法可以用来动态地创建新类,该新类衍生自一个已存在的主类,并参入新的扩展类来增加方法、attribute、事件、属性。默认情况下,build方法不会改变主类,但是,build方法调用时,可以通过配置,让他改变主类。

function Panel(configs){
	Panel.superclass.constructor.apply(this,arguments);
}
Panel.ATTRS = {
	close:{},
	minimize:{},
	show:{}
}
Y.extend(Panel,Y.Base,{
	show:function(){},
	hide:function(){},
	minimize:function(){}
});
function Resizable(){
	this._initResizable();
}
Resizable.ATTRS = {
	handles:{},
	constrain:{}
}
Resizable.prototype = {
	_initResizable:function(){},
	lock:function(){}
}
function Modal(){
	this._initModality();
}
Modal.ATTRS = {
	modal:{},
	region:{}
}
Modal.prototype = {
	_initModality:function(){},
	showMask:function(){},
	hideMask:function(){}
}
var windowPanel = Y.Base.build(“windowPanel”,panel,[Resizable,Modal]);
var wp = new WindowPanel({
	show:true,
	modal:true,
	handles:[“e”,”s”,”es”]
});
wp.lock():
wp.show();

build方法的内部实现:

  • 通过扩展主类创建一个新的类;
  • 将新的类与传入的扩展类合并,或其他们的原型方法;
  • 解析新类上的所有静态属性,需要集合的静态属性在主类的_buildCfg.aggregates属性上。比如:Base类定义ATTRS为必须解析的,Widget类将HTML_PARSER添加为必须解析的静态属性。


当新建的类被实例化时,在init生命周期中,新类会为新类和扩展类调用构造方法。

除了build方法以外,Base类还提供create方法和mix方法。这两个方法是在build方法之上的 “甜点方法”(sugar methods)。

Base.create

该方法为创建新类提供一个更简洁的方法,该方法可以传入额外的静态属性\方法和原型属性\方法。调用方式见API。

Base.mix

该方法可以在现有的类上直接添加扩展类。调用方式见API。

分享到:
评论

相关推荐

    yui 3.1.2 源码 6MB大小 0资源分

    在源码中,我们可以看到YUI的核心模块`yui-base`,它是所有其他模块的基础,提供了一些基础功能,如事件处理、DOM操作等。`event`模块是处理用户交互的关键,包括鼠标和键盘事件。而`node`模块则封装了DOM操作,使得...

    YUI js方法使用列子

    YUI().use('node-base', 'event-base', function(Y) { // 使用已加载的node-base和event-base模块 }); ``` 通过这些例子,我们可以看出YUI是一个功能全面且灵活的JavaScript库,适用于各种Web开发场景。无论你是...

    Ajax(yui-slideshow)

    3. **响应式设计**:确保在不同设备和屏幕尺寸上都能良好工作,可以结合YUI的 Responsive Base 模块进行适配。 总之,YUI Slideshow是一个强大的Ajax幻灯片组件,它集成了Ajax加载、过渡动画和自定义导航等功能,...

    Struts2中使用JSON+YUI之一[包含功能代码段]

    YUI().use('io-base', 'json-parse', function (Y) { Y.io('/myAction', { method: 'POST', on: { success: function (xid, response) { var data = Y.JSON.parse(response.responseText); console.log(data)...

    yui-hotel-calendar.rar

    #酒店价格日历 ####基于YUI3开发的价格日历组件 @name:Y.PriceCalendar @requires:['node', 'base-base', 'event-mouseenter']

    JS、CSS合并压缩工具说明

    在发布时,需要 yuicompressor-2.4.6.jar 这个第三方库来进行代码压缩。 3. TomsTools-tags-x.x.x.jar:提供了 JSP 自定义标签 `<tt:js>` 和 `<tt:css>`,以替代传统的 `<script>` 和 `<link>` 标签,使得可以直接...

    jQuery拖动剪裁上传图片作为头像代码

    8. **服务器端处理**:剪裁后的图片通常以Base64编码的形式发送到服务器,服务器端再将Base64字符串转换为二进制文件,保存为新的图片。这个过程可能涉及AJAX请求,使用jQuery的`$.ajax()`或`$.post()`方法。 9. **...

    BaseBox Widget Libraries-开源

    Basebox是dojo开发的框架,它包含一个简单的小部件API,您可以使用它来创建新的小部件或包装来自小部件库(例如Dojo,YUI,Zapatec或WebFX中的那些)的现有小部件。

    Spket_IDE,_Ext开发帮助

    3. **JavaScript Profile 支持**:支持多种 JavaScript 库和框架的 Profile 设置,例如 ExtJS、jQuery 和 YUI。 4. **Flash 脚本支持**:能够在 Spket IDE 中编辑 Flash 脚本。 5. **xpcom 支持**:用于跨平台组件...

    ECMAScriptBestPractices:基于道格拉斯·克罗克福德(Douglas Crockford)的Javascript YUI系列的ECMAScript中的良好实践的实现

    这个名为"ECMAScriptBestPractices"的项目,显然是基于Crockford的思想和他在YUI(Yahoo! User Interface Library)系列讲座中的讲解,提炼出了遵循的最佳实践。 1. **变量声明与作用域**: - 遵循单一变量声明...

    liby64:用于 Y64 编码和解码的 C 库-开源

    Y64 是 Base64 编码的一种... 有关更多信息,请参阅 http://en.wikipedia.org/wiki/Base64 和 http://www.yuiblog.com/blog/2010/07/06/in-the-yui-3-gallery-base64-and -y64-encoding/ 大部分代码直接来自 libb64 ...

    ExtJS6.0开发培训

    **步骤3:下载 Sencha Tool** - 下载地址:[http://cdn.sencha.com/cmd/6.0.0.202/no-jre/SenchaCmd-6.0.0.202-windows-no_jre.zip]...

    前端团队管理 前端基础架构的实践和思考 共22页.pdf

    * PREPROCESSING SYSTEM CSSPython-SCSSDouban-UICSS3-MIXIN * 库/框架通用功能库jQuerycommon.jscore.css / grid.cssbase.html * 通用组件UI非UI模板组件应用框架移动应用路由管理 * JS模板系统(jQuery Template/...

    Ext入门学习.docx

    3. 开发时只需要把 resources 包中的 CSS 和图片文件放到 common 下面,还有把 ext-all.js 和 adapter/ext/ext-base.js 放入到 js 中就可以了 ExtJS 的选择器是通过 Ext.Element 来实现的,它是 ExtJS 的核心对象,...

    ext入门必学

    **知识点3:下载Ext** 访问官方下载页面`http://extjs.com/downloads`,选择最新稳定版本或所需特定版本进行下载。本教程使用的是ext-1.1版本,虽然现在可能已经不是最新版本,但其基础原理和结构依然适用于后续...

Global site tag (gtag.js) - Google Analytics