QWrap简介之:core_retouch ---渲染原生类

Prototype框架最开始挖掘了javascript的prototype,不过原型渲染是有代价的,例如:IE下为Array.prototype添加forEach后,会导致对数组作for in循环时,多出一些不希望看到的东西。这是因为我们添加的方法,在某些浏览器下,无法进行设置enumerable为false,导致它会被for in出来。但是易于使用又诱惑我们那样做,我们需要有所取舍。
这里推荐的core_retouch是将风格调成与prototpye框架一致,所以也会有prototype所拥有的缺点:
1。如果渲染的方法与标准有差异,会给某些用户留下坑坑。
2。同时存在多个JS框架时,如果都想渲染同一个方法,而各自实现不同,可能会有冲突。
3。如果原型已有某方法,再强制渲染的话,可能会损失效率。
4。如果用谦虚渲染(不覆盖已经存在的),则需要自己的实现与标准尽量做持一致,以免产生不同的浏览器兼容不一致。
5。没有标准可依的,如果我们现在加上去,用户已接受这种用法,也要小心:万一以后新标准有了,那么现在的实现就成了历史包袱。
6。Array.prototype如果被渲染了,会造成array的for in功能障碍。
7。Object.prototype如果被渲染了,会造成object的for in功能障碍。----所以,千万别这么做。
…………

其中,
第1234条,对应的策略可以是:如果已有标准可参考,则尽量按标准来,渲染时采用谦虚渲染。
第5条,取名时尽量清晰,参数尽量少,以免将来碰钉子。
第6条,只能隐忍委屈一下了。
第7条,要保证,不污染Object.prototype。

好的,我们明白了这些,那我们就来看所推荐的core_retouch吧。
(function() {
var methodize = QW.HelperH.methodize,
mix
= QW.ObjectH.mix;
/**
* @class Object 扩展Object,用ObjectH来修饰Object,特别说明,未对Object.prototype作渲染,以保证Object.prototype的纯洁性
* @usehelper QW.ObjectH
*/
mix(Object, QW.ObjectH);

/**
* @class Array 扩展Array,用ArrayH/HashsetH来修饰Array
* @usehelper QW.ArrayH,QW.HashsetH
*/
mix(QW.ArrayH, QW.HashsetH);
mix(Array, QW.ArrayH);
mix(Array.prototype, methodize(QW.ArrayH));

/**
* @class Function 扩展Function,用FunctionH/ClassH来修饰Function
* @usehelper QW.FunctionH
*/
mix(QW.FunctionH, QW.ClassH);
mix(Function, QW.FunctionH);
// mix(Function.prototype, methodize(QW.FunctionH));

/**
* @class Date 扩展Date,用DateH来修饰Date
* @usehelper QW.DateH
*/
mix(Date, QW.DateH);
mix(Date.prototype, methodize(QW.DateH));


/**
* @class String 扩展String,用StringH来修饰String
* @usehelper QW.StringH
*/
mix(String, QW.StringH);
mix(String.prototype, methodize(QW.StringH));
}());


retouch后,就可以按prototype框架的风格来使用String、Array的方法了。
其中的几点说明一下:
1。静态方法移植:有同学可能已经发现,我们把ObjectH上的方法,直接mix到Object上去了。也就是说,之前的“QW.ObjectH.mix(a,b)”写法可以改成“Object.mix”了。
2。原有的原型渲染都是谦虚渲染。不过,部分浏览器实现的String.prototype.trim没有处理中文空格,我们该不该覆盖?----犹豫中。
3。Function.prototype的渲染为什么被注释掉了?----考虑到FunctionH已经mix到Function上了,Function.bind(fun,obj),虽说比fun.bind(obj)写起来要麻烦一点点,但是也避免了所有的function都加上了bind等方法的困惑与隐患。----犹豫中。
4。ArrayH的方法mix到Array上当静态方法,让所有的浏览器都支持了数组泛型,例如,可以Array.filter(document.body.childNodes,function(el){return el.tagName;});

附: QWrap网址:http://www.qwrap.com

posted on 2011-03-26 19:36  JKisJK  阅读(632)  评论(0编辑  收藏  举报

导航