[转帖]Mootools源码分析-12 -- Class

原帖地址:http://space.flash8.net/space/?uid-18713-action-viewspace-itemid-402350

原作者:我佛山人

 

/*
作为内置类型的Class,使JS的优雅OOP成为可能
因为1519版本有bug,所以以1543版代码为例
*/
var  Class  =   new  Native({

    
// 族名,为$type提供精准类型判断
    name:  ' Class ' ,

    
// JS way的构造函数,始于Prototype?
    initialize:  function (properties)    {

        properties 
=  properties  ||  {};

        
// 真正用于返回的类的原型
         var  klass  =   function (empty)    {

            
// 复制前先解除关联      
             for  ( var  key  in   this )     this [key]  =  $unlink( this [key]);

            
// 复制Class.Mutators的方法,使新类支持实现和继承
             for  ( var  mutator  in  Class.Mutators)    {
                
if  ( ! this [mutator])     continue ;
                Class.Mutators[mutator](
this this [mutator]);

                
// 已使用,移除
                 delete   this [mutator];
            }

            
this .constructor  =  klass;

            
// 给构造函数传空函数时直接返回,不作后续处理
             if  (empty  ===  $empty)     return   this ;

            
// 对于类本身的构造函数,将参数原样传递
             var  self  =  ( this .initialize)  ?   this .initialize.apply( this , arguments) :  this ;

            
// 对于参数中的方法,直接执行,不传递参数
             if  ( this .options  &&   this .options.initialize)     this .options.initialize.call( this );

            
return  self;
        };

        
// 将Class的特性复制给klass,相当于让klass继承Class
        $extend(klass,  this );
        klass.constructor 
=  Class;

        
// 指定原型
        klass.prototype  =  properties;
        
return  klass;
    }

});

// 使用继承自Native的implement方法,让新的implement覆盖之
Class.implement({

    implement: 
function ()    {
        Class.Mutators.Implements(
this .prototype, Array.slice(arguments));
        
return   this ;
    }

});

Class.Mutators 
=  {};

/*
使类支持Implements的写法实现
var myClass = new Class({
Implements : [Events, Options],

});
*/
Class.Mutators.Implements 
=   function (self, klasses)    {
    
// $splat使支持多个Implements
    $splat(klasses).each( function (klass)    {
        $extend(self, ($type(klass) 
==   ' class ' ?   new  klass($empty) : klass);
    });
};

/*
使类支持Extends的写法继承
var myClass = new Class({
Extends : Base,

});
*/
Class.Mutators.Extends 
=   function (self, klass)    {
    klass 
=   new  klass($empty);
    
for  ( var  property  in  klass)    {
        
var  kp  =  klass[property];
        
var  sp  =  self[property];
        self[property] 
=  ( function (previous, current)    {
        
// 继承出现相同属性、方法时的处理
         if  ($defined(current)  &&  previous  !=  current)    {
            
var  type  =  $type(current);
            
if  (type  !=  $type(previous))     return  current;
            
switch  (type)    {
            
case   ' function ' :
                
return   function ()    {
                    
// 继承出现同名方法时,this.parent可以引用到父类的同名方法
                    current.parent  =   this .parent  =  previous.bind( this );
                    
var  value  =  current.apply( this , arguments);
                    
this .parent  =  current.parent;
                    
return  value;
                };
            
case   ' object ' return  $merge(previous, current);
            
default return  current;
            }
        }
        
return  previous;
        })(kp, sp);
    }    
};

 

转载于:https://www.cnblogs.com/maapaa/articles/mootools-s-12.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值