javascript面向对象包装类Class封装类库剖析(2)


/*globalsdefine:true,window:true,module:true*/
(function(){
//Namespaceobject
varmy={};
//保证AMD分模块可用
if(typeofdefine!=='undefined')
define([],function(){
returnmy;
});
elseif(typeofwindow!=='undefined')
//保证客户端可用
window.my=my;
else
//保证后台可用
module.exports=my;
//============================================================================
//@methodmy.Class
//@paramsbody:Object
//@paramsSuperClass:function,ImplementClasses:function...,body:Object
//@returnfunction
my.Class=function(){
varlen=arguments.length;
varbody=arguments[len-1];//最后一个参数是指定本身的方法
varSuperClass=len>1?arguments[0]:null;//第一个参数是指继承的方法,实例和静态部分均继承
varhasImplementClasses=len>2;//如果有第三个参数,那么第二个就是implementClass,这里其实只继承实例对象
varClass,SuperClassEmpty;
//保证构造方法
if(body.constructor===Object){
Class=function(){};
}else{
Class=body.constructor;
//保证后面不覆盖constructor
deletebody.constructor;
}
//处理superClass部分
if(SuperClass){
//中间件实现实例属性的继承
SuperClassEmpty=function(){};
SuperClassEmpty.prototype=SuperClass.prototype;
Class.prototype=newSuperClassEmpty();//原型继承,解除引用
Class.prototype.constructor=Class;//保证constructor
Class.Super=SuperClass;//父对象访问接口
//静态方法继承,重载superClass方法
extend(Class,SuperClass,false);
}
//处理ImplementClass部分,其实只继承实例属性部分,除SuperClass#arguments[0]#和body#arguments[length-1]#
if(hasImplementClasses)
for(vari=1;i<len-1;i++)
//implement是继承的实例属性部分,重载父对象implementClass方法
extend(Class.prototype,arguments[i].prototype,false);
//处理本身声明body部分,静态要STATIC指定,实例部分要删除STATIC部分
extendClass(Class,body);
returnClass;
};
//============================================================================
//@methodmy.extendClass
//@paramsClass:function,extension:Object,?override:boolean=true
varextendClass=my.extendClass=function(Class,extension,override){
//静态部分继承静态部分
if(extension.STATIC){
extend(Class,extension.STATIC,override);
//保证实例部分不继承静态方法
deleteextension.STATIC;
}
//实例属性继继承实例部
extend(Class.prototype,extension,override);
};
//============================================================================
varextend=function(obj,extension,override){
varprop;
//其实这里的flase是表明,覆盖父对象的方法
if(override===false){
for(propinextension)
if(!(propinobj))
obj[prop]=extension[prop];
}else{
//这里其实不覆盖父对象的方法,包括toString
for(propinextension)
obj[prop]=extension[prop];
if(extension.toString!==Object.prototype.toString)
obj.toString=extension.toString;
}
};
})();


二、KLASS
项目地址:https://github.com/ded/klass
先看使用方法:
a、新建一个类

复制代码 代码如下:


//声明一个类
varPerson=klass(function(name){
this.name=name
})
.statics({//静态方法
head:':)',
feet:'_|_'
})
.methods({//实例方法
walk:function(){}
})


b、继承一个类

复制代码 代码如下:


//SuperHuman继承Person
varSuperHuman=Person.extend(function(name){
//自动调用父类的构造方法
})
.methods({
walk:function(){
//显式声明调用父类的walk方法
this.supr()
this.fly()
},
fly:function(){}
})
newSuperHuman('Zelda').walk()


c、字面量方式声明一个类

复制代码 代码如下:


varFoo=klass({
foo:0,
initialize:function(){
this.foo=1
},
getFoo:function(){
returnthis.foo
},
setFoo:function(x){
this.foo=x
returnthis.getFoo()
}
})


d、实现一个类的方法
因为有时候你可能希望覆写或者混合一个实例方法,可以这样:

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddgyf.html