zoukankan      html  css  js  c++  java
  • mass Framework class模块 v5

    新版本进行大规模的重构,继承链与方法链被重新实现。在方法中调用父类的同名实例方法,由$super改为supermethod,保留父类的原型属性parent改为superclass。

    //"use strict";
    (function(global,DOC){
        var dom = global[DOC.URL.split("#")[0]];
        dom.define("class", "lang",function(){
            //=========================================
            // 核心模块 第一类工厂
            //==========================================
            var 
            P = "prototype",  C = "constructor", F = "function",I = "@init",S = "superclass",
            unextend = dom.oneObject([P,S, 'extend', 'include','toString',"supermethod"]),
            exclusive = dom.oneObject([C,I]),empty = function(){},
            classOne = dom.oneObject('Object,Array,Function');
            function expand(klass,props){
                'extend,include'.replace(dom.rword, function(name){
                    var modules = props[name];
                    if(classOne[dom.type(modules)]){
                        klass[name].apply(klass,[].concat(modules));
                        delete props[name];
                    }
                });
                return klass
            }
            dom["@class"] =  {
                inherit : function(parent,init) {
                    if(typeof parent == F){
                        for(var i in parent){//继承类方法与属性
                            this[i] = parent[i]
                        }
                        dom.mix(this[P],parent[P]);//继承原型方法与属性
                        this[S]  = parent;
                    }
                    //添加obj.extend,obj.include里面的对象或类到类中去
                    this.toString = dom.K( (init || empty) + "");
                    this[P].supermethod = function(){
                        var callee = arguments.callee;
                        var caller = callee.caller;                
                        if( caller && caller._method ){
                            return caller._method.apply(this,arguments)
                        }
                    }
                    var KP = this[P];
                    KP[I] = (KP[I] || []).slice();
                    if(typeof init == F){
                        KP[I].push(init);
                    }
                    KP.setOptions = function(){
                        this.options = dom.Object2.merge.apply(this.options || {}, arguments);
                        return this;
                    }
                    return  KP[C] = this;
                },
                extend: function(){//扩展类成员
                    var middleware = {}
                    for(var i = 0, module; module = arguments[i++]; ){
                        dom.mix(middleware, module);
                    }
                    Object.keys(middleware).forEach(function(name){
                        if(!unextend[name]){
                            this[name] =  middleware[name];;
                        }
                    }, this);
                    return this;
                },
                include:function(){//扩展原型成员     
                    var son = this[P],parent = (this[S] || Function)[P], middleware = {}, _method, method;
                    for(var i = 0, module; module = arguments[i++]; ){
                        if(dom.type(module,"Object")){
                            dom.mix(middleware, module);
                        }else if(typeof module === F){
                            dom.mix(middleware, new module);
                        }
                    }
                    Object.keys(middleware).forEach(function(name){
                        if(!exclusive[name]){
                            _method = parent[name];
                            method = middleware[name];
                            son[name] = method;
                            if( typeof method === F && typeof _method === F ){   
                                son[name]._method = _method;
                            }
                        }
                    });
                    return this;
                }    
            };
            dom.factory = function(obj){
                obj = obj || {};
                var parent  = obj.inherit //父类
                var init = obj.init ; //构造器
                delete obj.inherit;
                delete obj.init;
                var klass = function() {
                    for(var i = 0 , init ; init =  this[I][i++];){
                        init.apply(this, arguments);
                    }
                };
                dom.mix(klass,dom["@class"]).inherit(parent, init);//添加更多类方法
                return expand(klass,obj).include(obj);
            }
        });
    
    })(this,this.document);
    //2011.7.11
    //dom["class"]改为dom["@class"]
    //2011.7.25
    //继承链与方法链被重新实现。
    //在方法中调用父类的同名实例方法,由$super改为supermethod,保留父类的原型属性parent改为superclass
    

    一些测试:

    
          dom.require("class",function(){
            var Ancestor = dom.factory({
              init:function(name){
                this.name = name;
              },
              ancestor_prop:"3333333",
              instance_fn:function(){
                return "ancestor_instance"
              },
              instance_fn2:function(){
                return "ancestor_instance2"
              },
              extend:{
                class_fn:function(){
                  return "ancestor_class";
                }
              }
            });
            var Parent = dom.factory({
              inherit:Ancestor,
              instance_fn:function(){
                return this.supermethod()+"-->Parent";
              },
              extend:{
                class_fn:function(){
                  return "parent_class";
                }
              }
            });
            var Son = dom.factory({
              inherit:Parent,
              init:function(name,age){
                this.age = age;
              },
              instance_fn2:function(){
                return this.supermethod()+"-->Son";
              },
              instance_fn3:function(){
                return "instance_fn3"
              },
              extend:{
                class_fn:function(){
                  return "son_class";
                }
              }
            });
            var p = new Parent("john");
            dom.log(p.instance_fn());
            dom.log(Parent.class_fn());
            var s = new Son("nasami",44);
            dom.log(s.instance_fn());
            dom.log(s.age);
            dom.log(s.name);
            dom.log(s.instance_fn2());
            dom.log(Son.class_fn());
          });
    
    

    相关链接:

    dom Framework oop模块 v4
    dom Framework oop模块 v3
  • 相关阅读:
    poj 1035 字符串匹配
    拓扑排序的小总结
    POJ1018
    POJ1328详细题解
    POJ1159题解报告
    POJ1088 (滑雪)
    树状树组区间修改,单点修改模板
    spfa模板
    树状树组离散化求逆序对模板
    POJ3723(最小生成树,负权)
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2116071.html
Copyright © 2011-2022 走看看