klass.extend = function(obj){
    var extended = obj.extended;//其实还有这一句,也不是很清楚它的用意
    for (var i in obj){
        klass[i] = obj[i];
    }
    if(extended) extend(klass)//就是这句不明白
};完全代码是:var Class = function(){
    var klass = function(){
        this.init.apply(this, arguments);
    };
    klass.prototype.init = function(){};
     
    klass.fn = klass.prototype;
 
    klass.fn.parent = klass;
  
    klass.extend = function(obj){
        var extended = obj.extended;//其实还有这一句,也不是很清楚它的用意
        for(var i in obj){
            klass[i] = obj[i];
        }
        if (extended) extended(klass)//就是这句不明白
    };    klass.include = function(obj){
        var included = obj.included;
        for(var i in obj){
            klass.fn[i] = obj[i];
        }
        if (included) included(klass)
    };
    return klass;
};
javascript类库 类 属性

解决方案 »

  1.   

    var extended = obj.extended;//其实还有这一句,也不是很清楚它的用意
    extended 等于 obj.extended,可以使function 也可以是其他对象要看obj的extended的具体指向if (extended) extended(klass)//就是这句不明白
    如果extended 不是undefined 、false,0就执行extended即,执行的问题obj.extended(klass);从字面上(class,extend)理解,这些做了部分面向对象语言的语法的工作。这是基于原生js对js的类面向对象的模拟。
      

  2.   

    是的,这是基于原生js对js的类面向对象的模拟。我明白extended(klass)==obj.extended(klass)
    就是像请教obj.extended(klass)的用意是什么呢?
    为什么把klass还作为了参数了呢?
      

  3.   

    这好像拔赤翻译的《基于mvc的javascript富应用开发》一书中的代码。这种写法是模拟了Ruby中的
    对象继承机制。在Ruby对象被继承和模块被包含是会触发事件的。从而可以实现动态代码注入的效果。
    下面是一个小例子var Class = function(){
        var klass = function(){
            this.init.apply(this, arguments);
        };
        klass.prototype.init = function(){};
          
        klass.fn = klass.prototype;
      
        klass.fn.parent = klass;
       
        klass.extend = function(obj){
            var extended = obj.extended;
            for(var i in obj){
                klass[i] = obj[i];
            }
            if (extended) extended(klass)
        };
     
        klass.include = function(obj){
            var included = obj.included;
            for(var i in obj){
                klass.fn[i] = obj[i];
            }
            if (included) included(klass)
        };
        return klass;
    };
    var Animal = new Class;
    Animal.prototype.init = function(name){
       this.name = name;    
    };var CommonUtils = {
        extended : function(klass){
            console.log('MixIn is extend');        
            
            //为klass动态注入方法
            klass.fn['say'] = function(){
                console.log('hi my name is :' + this.name);
            }
        }
    }Animal.extend(CommonUtils);
    var cat = new Animal('mimi');
    cat.say();
      

  4.   

    很多时候不是代码你不明白而是你的认知中根本就没有这样的概念:原来对象被继承是可以有事件的。
    目前我知道的只有Ruby有这个特性。所以多学一门语言很有好处,可以开阔你的眼界。Ruby是一门很
    值得学习的语言,很适合做一些日常小工具。
      

  5.   

    klass.extend = function(obj){
        var extended = obj.extended;//其实还有这一句,也不是很清楚它的用意
        for (var i in obj){
            klass[i] = obj[i];
        }
        if(extended) extend(klass)//就是这句不明白
    }extended的作用就是如果一个对象被继承完成之后如果想做一些事情就需要实现这个方法,这是一种约定方式,或者可以理解为某对象继承了obj对象完成之后通知obj,如果要做一些额外的事情可以这个时候做了,通知的方式则是大家约定好的借口,也就是是否拥有extended方法。
    例如:obj对象想被继承成功后写个log,obj.extended = function() {console.log('被继承成功。');}
      

  6.   


    klass.extend = function(obj){
        var extended = obj.extended;//获取参数的obj的extended属性的值(这个属性的值如果存在,其实是一个function),并赋值给extended变量
        for (var i in obj){
            klass[i] = obj[i];
        }
        if(extended) extended (klass)//如果extended 变量的值不为undefined,则调用这个方法(其实就是obj.extended)
    };
      

  7.   


    谢谢啊,这种说法我大概能理解了,好像回调一样是吧,谢谢你和xingqiliudehuanghun
      

  8.   

    var extended = obj.extended;//声明一个变量extended,并赋值 
        for (var i in obj){
            klass[i] = obj[i];
        }
        if(extended) extend(klass)//如果有extended的定义,则调用函数 extend