网络编程
位置:首页>> 网络编程>> JavaScript>> YUI学习笔记(1)(2)

YUI学习笔记(1)(2)

作者:xujiwei 来源:HotHeart's BLOG 发布时间:2009-01-12 18:06:00 

标签:yui,笔记,函数,JavaScript

在处理 overrides 的最后,还修复了 IE 中不枚举与内部函数同名的函数的 bug,即例如 overrides 中包含了 toString 或 valueOf 的定义,但是这两个函数也是 Object 对象所具有的,在 IE 中使用 for(p in overrides) 就不会得到这两个函数,因此需要修复,这是 YAHOO.lang 中 _IEEnumFix 函数所做的工作。


if (overrides) {
    for (var i in overrides) {
    if (L.hasOwnProperty(overrides, i)) {
        subc.prototype[ i ]=overrides[ i ];
    }
    }
    L._IEEnumFix(subc.prototype, overrides);
}

_IEEnumFix 只是简单的判断当前浏览器是否为 IE,如果为 IE 则从一个已经定义的列表中获取在 IE 中枚举不到的函数名列表,逐一判断是否为源对象自身的属性并且与 Object 原型中的同名函数不一样,如果是则添加到目标对象。如果浏览器不是 IE 则 _IEEnumFix 直接就是一个空函数,直接不处理。

_IEEnumFix: (YAHOO.env.ua.ie) ? function(r, s) {
    for (var i=0;i<ADD.length;i=i+1) {
    var fname=ADD[ i ],f=s[fname];
    if (L.isFunction(f) && f!=Object.prototype[fname]) {
        r[fname]=f;
    }
    }
} : function(){},

3. YAHOO.lang.augmentObject(yahoo.js)

augmentObject 方法用来引入目标对象的属性,并且处理重写,通常用于合并配置对象与默认配置对象。

augmentObject 有三种调用方法,分别是:

augmentObject(result, source),一般情况下用些方法,从 source 引入 result 中没有的属性;

augmentObject(result, source, override),override 设置是否覆盖,如果是 true 的话,那么 source 中所有属性会覆盖 result 中已有的属性;

augmentObject(result, source, ovrride_name, ...),指定要覆盖属性的列表,source 参数后为要覆盖属性名称的列表,例如覆盖 result 中的 toString 和 valueOf,那么可以调用 augmentObject(result, source, "toString", "valueOf")来实现。

合并对象的最后同样调用了 _IEEnumFix 方法来修正 IE 中不枚举与内部属性同名属性的 bug。

augmentProto 与 augmentObject 功能基本相同,只不过后者是处理对象,而前者是处理函数的 prototype,它是通过使用两个参数的 prototype 来构造一个参数列表,传递给 augmentObject 对象来实现 augmentProto 的功能。

var a=[r.prototype,s.prototype];
for (var i=2;i<arguments.length;i=i+1) {
    a.push(arguments[ i ]);
}
L.augmentObject.apply(this, a);

因为 augmentProto 是调用 augmentObject 来实现的,因此它的调用格式也是 augmentObject 一样,具体可以看看上面 augmentObject 的三种调用方法。

另外,YAHOO.lang.merge 方法也是通过调用 augmentObject 方法来实现对象的合并。 

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com