上班前这几天得学习下公司的核心框架之一YUI2.8了,这个框架的确和以前专门用的jQ有很大的不同,代码量上去了,但设计模式等方面是相当优雅,粗略学习了下API和源码架构~~写一下对于YUI核心的一些东西学习的笔记摘要。(小弟写的不好~~轻拍)
零、Yahoo全局文件
首先从核心文件yahoo.js开始:
核心文件主要是定义了yahoo一些全局的方法:
1. YAHOO.namespace
这个方法是用于自定义命名空间的,当然框架已经定义好三个了:
YAHOO.namespace("util", "widget", "example");
我们也可以自己定义
2、YAHOO.log
这个方法是记录日志的方法,这个方法可以说是一个快捷方法,是YAHOO.widget.Logger.log的快捷方法,但前提是必须引入上面的包~~
3、YAHOO.register
这个方法是在Yahoo中注册模块,注明它的name和version,一般会出现在组件代码的最后位置:
YAHOO.register("animation", YAHOO.util.Anim, {version: "2.8.1", build: "19"});
4、YAHOO.lang
这个对象是个工具对象,下面实现了很多常用的方法,具体看源码,下面几个比较有代表性
YAHOO.lang.hasOwnProperty
这个方法可以用来过滤直接添加到Object的原型上的属性。其实除了 Safari所有浏览器都实现了这个方法 。
YAHOO.lang.augmentProto
YAHOO.lang.augmentProto 是重用原型的,可以把s对象的原型复制到r中
YAHOO.lang.augmentProto(r,s);
这边还有一个函数叫augmentObject,用法和上面的方法一样,只是它是将一个对象的所有属性添加到接收对象身上,如果接收对象已有某属性则不添加该属性。
var a=arguments, i, p, overrideList=a[2]; if (overrideList && overrideList!==true) { for (i=2; i<a.length; i=i+1) { r[a[i]] = s[a[i]]; } }
注意这边要是有第三个参数或以上,这些参数代表着需要替换的属性,如果接收对象本来已经有了某个属性,则不添加该属性如果该参数是true,所有提供对象的属性和方法将被添加到接收对象,如果接收对象已经有了某个属性则覆盖原有属性。
在augmentProto也是通过上述机制对augmentObject进行重用:只是将两个的prototype传入而已:
var a=[r.prototype,s.prototype], i; /*其间省略三行*/ L.augmentObject.apply(this, a);
YAHOO.lang.extend
这个方法也是一个核心方法:类似于prototype框架中的Extend方法,也是对于继承的一个封装方法
extend: function(subc, superc, overrides) { if (!superc||!subc) {//这两个是必须的传入参数 throw new Error("extend failed, please check that " + "all dependencies are included."); } var F = function() {}, i;//新建一个F中间类 F.prototype=superc.prototype;//使F的原型指向超类的原型 subc.prototype=new F();//用中间类new出一个对象并使子类的原型对象指针指向它,但此处子类的构造函数constructor指向F subc.prototype.constructor=subc;//重新把构造函数指向原来的子类回来 subc.superclass=superc.prototype;//在子类中定义一个叫superclass的静态对象指向超类的原型 if (superc.prototype.constructor == OP.constructor) {//OP是Object.prototype superc.prototype.constructor=superc; } if (overrides) { for (i in overrides) { if (L.hasOwnProperty(overrides, i)) { subc.prototype[i]=overrides[i]; } } L._IEEnumFix(subc.prototype, overrides); } },
这边继续是经典的类式继承(具体什么是类式继承看我上面的注释,犀牛书上也有),不过写的更加的细致,第三个传入是需要重写的属性,在子类的原型中添加这些属性。
这里注意相对于2.4版本,这边的2.8对于上面的对象以设置别名L,在下面定义:
YAHOO.util.Lang = L; L.augment = L.augmentProto; YAHOO.augment = L.augmentProto; YAHOO.extend = L.extend;
5、YAHOO_config 和 YAHOO.env
下面引自官方解释翻译:
YAHOO.env 包含了页面中所加载的所有YUI组件的信息,任何组件都可以使用 YAHOO.env.getVersion 来访问到这些信息,当动态加载YUI组件的时候这个方法就特别有用,因为可以查看版本检测依赖关系。
YAHOO_config是一个对象,你可以在它上面定义一个回调函数,这样每当页面中加载一个新的YUI组件的时候,这个回调函数就会自动执行,并且会传送给它一个包含了组件信息的对象。
貌似写的太长了,分几篇写吧。。。。。第二篇DOM