• 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
  • 相关阅读:
    入门MySQL——基础语句篇
    装饰者模式
    (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter
    (18)IO流之字节缓冲路
    (17)IO中的异常处理
    (16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream
    (15)IO流之File
    (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
    (13)正则表达式
    (12)泛型
  • 原文地址:https://www.cnblogs.com/jkisjk/p/qwrap_core_retouch.html
Copyright © 2020-2023  润新知