javascript“类”库的一行代码,不明白

求助:javascript“类”库的一行代码,不明白klass.extend function(obj){var extended obj.extended//其

求助:javascript“类”库的一行代码,不明白


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 类库?类?属性
[解决办法]
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的类面向对象的模拟。
[解决办法]
这好像拔赤翻译的《基于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();


[解决办法]
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('被继承成功。');}
[解决办法]

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)
};