Ruby's Louvre

每天学习一点点算法

导航

mass Framework oop模块 v4

将oop模块永久更名为class模块,移除一些nonew,unnew这两个配置属性,想使用无new实例化可以通过如下方法实现:

    dom(function(){
      var test = function(name){
        return new test.fn.init(name)
      }
      dom.mix(test, dom["class"]).include({
        init:function(name){
          console.log("=============")
          this.name = name;
        },
        getName:function(){
          return this.name
        },
        setName:function(name){
          this.name = name
        }
      });
      test.fn = test.prototype;
      test.fn.init.prototype = test.fn;
      var a = test("司徒正美")
      alert(a.getName())
    });

新增setOptions API.

在Prototype中,我们重新一个类的属性,通常使用如下的格式:

    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

在jquery中,可能就是这样,从理论上来使用深拷贝应该更安全,不过这也视情况而定。

    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    this.options = $.extend(true,{}, this.options, options );

我的框架与mootools走的是同一路线,专门提供一个方法干这事情:

    dom.require("class",function(){
      var A = dom.factory({
        options:{aaa:"1111"},
        init:function(){
          this.setOptions({
            aaa:"aaa",
            bbb:"bbb",
            ccc:"ccc"
          });
        }
      });
      var a = new A;
      dom.log(a.options)
    });
//by 司徒正美 2011.7.4
;(function(global,DOC){
    var dom = global[DOC.URL.split("#")[0]];
    dom.define("class", "lang",function(){
        //=========================================
        // 核心模块 第一类工厂
        //==========================================
        var 
        P = "prototype",  C = "constructor", F = "function",
        EXTEND = [P,  'extend', 'include', 'inherit', 'ancestors', 'parent'],
        INCLUDE = [C],
        classOne = dom.oneObject(['Object',"Array","Function"]),
        objectEach = dom.Object2.forEach;
        function addModule(klass,props){
            'extend,include'.replace(/\w+/g, function(name){
                var modules = props[name];
                if(classOne[dom.type(modules)]){
                    klass[name].apply(klass,[].concat(modules));
                    delete props[name];
                }
            });
        }
        function cleanModule(module,props){
            for(var i = 0, name ; name = props[i++];){
                delete module[name]
            }
            return module;
        }
        dom["class"] =  {
            inherit : function(parent) {
                if (parent && parent[P]) {
                    this[P] = Object.create(parent[P]);//高效设置原型链
                    this.parent = parent;
                }
                this.ancestors =  [];
                while (parent) {//收集所有父类,用于构建方法链时查找同名方法
                    this.ancestors.push(parent);
                    parent = parent.parent;
                }
          
                this[P].setOptions = function(){
                        this.options = dom.Object2.merge.apply(this.options || {}, arguments)
                        return this;
                }
                return this[P][C] = this;
            },
            extend: function(){//扩展类成员
                for(var i = 0, module; module = arguments[i++]; ){
                    if(module){
                        dom.mix(this, cleanModule(module,EXTEND))
                    }
                }
                return this;
            },
            include:function(){//扩展原型成员
                var parents = [this].concat(this.ancestors), target = this[P],modules = [];
                for(var i = 0, module; module = arguments[i++]; ){
                    if(dom.type(module,"Object")){
                        modules.push(module);
                    }else if(typeof module === F){
                        modules.push(new module);
                    }
                }
                modules.forEach(function(module){
                    objectEach.call(cleanModule(module,INCLUDE),function(method,name){
                        var i = 0,parent,super_method;
                        while((parent = parents[i++])){
                            if (parent[P] && name in parent[P]) {
                                super_method = parent[P][name];
                                break;
                            }
                        }
                        if( typeof method === F && typeof super_method === F ){
                            target[name] =  function() {
                                this.$super = super_method;
                                return method.apply(this, arguments);
                            }
                            target[name].toString = dom.K(method + "");
                        }else{
                            target[name] = method;
                        }
                    });
                });
                return this;
            }
            
        };
        dom.factory = function(obj){
            obj = obj || {};
            var parent  = obj.inherit || {}; //父类
            var init = obj.init || function(){};
            delete obj.inherit;
            delete obj.init;
            var klass = function() {
                parent.apply && parent.apply(this, arguments);
                return init.apply(this, arguments);//确保有实例返回
            };
            dom.mix(klass,dom["class"]).inherit(parent ).extend(parent );
            addModule(klass,obj);//添加obj.extend,obj.include里面的对象或类到类中去
            klass.toString = dom.K(init+"");
            return klass.include(obj);
        }
    });

})(this,this.document);

posted on 2011-07-04 00:14  司徒正美  阅读(1263)  评论(1编辑  收藏  举报