提供简单快速创建可维护、可扩展的(继承、重写)类的方法
JavaScript HTML
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
README.md
index.html

README.md

createClass

提供简单快速创建可维护、可扩展的(继承、重写)类的方法

使用方法

方法说明

/*
 * @param Function `constructor` 类的构造体函数
 * @param Object `prototype` 将会扩展到原型上的一组对象方法
 * @param Function `parentConstructor` 要继承的父类,支持多继承(多继承情况下第一个出现的父类会作为默认原型)
 *
 * @return Class 返回包装好的类,可以通过new来实例化类对象;也可以省略new操作符
 *
 * 类方法支持 private、static 等关键词声明,参加下方例子。使用该关键词的方法在相关使用时会被优先调用:一个类声明了两个同名方法,一个使用了private关键声明为私有方法;则内部调用时会执行私有方法,外部调用会执行公有方法。
 * 子类方法或者构造函数中可以使用 _super 来调用父类方法或者构造函数
 * 具体使用请参加下方例子(* 私有方法声明不支持ES5严格模式"use strict",因为Function.caller无法获取。如果需要private,请确认该类在非严格模式上下文中定义)
 */
function createClass(constructor,[prototype,...],[parentConstructor,...]){
	//...
}

###例1 创建类

	//创建Car类,拥有一个 name 属性,两个公有 getName、getNameByPrivate 方法,两个私有 getName、getNamePrivate 方法,一个静态 getName 方法
	var Car=createClass(function(name){
			this.name=name;
		},{
			getName:function(){
				return this.name;
			},
			getNameByPrivate:function(){//内部调用将优先调用私有方法
				return this.getName();
			},
			'private:getName':function(){
				return '私有方法调用结果:'+this.getNamePrivate();
			},
			'private:getNamePrivate':function(){
				return this.name;
			},
			'static:getName':function(){
				return '静态调用';
			}
		});
		
	//实例化
	var car=new Car('宝马');
	var car1=Car('奔驰'); //省略`new`操作符
	
	//下面的getName属于外部调用,会执行公有方法
	document.writeln(car.getName());//宝马
	document.writeln(car1.getName());//奔驰
	
	//getNameByPrivate是公有方法,但是其内部调用了私有的getName方法,所有输出有所不同
	document.writeln(car.getNameByPrivate());//私有方法调用结果:宝马
	
	//静态方法调用
	document.writeln(Car.getName());//静态调用
	
	//下面调用会报错,因为私有方法不允许外部调用
	try{car1.getNamePrivate()}catch(e){document.writeln(e.message);}//Cant not run a private method!

###例2 创建并继承父类

	//创建Bike类,继承Car的方法并添加一个新方法`getDesc`
	var Bike=createClass(function(name){
			`this._super(name);`//调用父类的构造方法
		},{
			getDesc:function(){
				return '这是一辆'+this.getName();
			}
		},Car);
		
	//实例化
	var bike=new Bike('自行车');
	document.writeln(bike.getName());//自行车
	document.writeln(bike.getDesc());//这是一辆自行车

###例3 创建并继承多个父类

	//使用普通方法创建一个Drive类(验证多继承同样适用于非使用createClass创建的类)
	function Drive(name){this.name=name;}
	Drive.prototype.start=function(){
		this.status='行驶中';
	}
	Drive.prototype.stop=function(){
		this.status='停止';
	}
	
	//创建Bus类,继承Car、Drive的方法并添加一个新方法getColor
	var Bus=createClass(function(name,color){
			this._super(name);//调用父类的构造方法
			this.color=color;
		},{
			getColor:function(){
				return this.color;
			},
			getDesc:function(){//重写父类方法,并通过_super来调用父类方法
				return this._super()+',颜色是'+this.getColor();
			}
		},Drive,Bike);
		
	//实例化
	var bus=new Bus('公共汽车','黄色');
	bus.start();//调用继承自父类的方法
	document.writeln(bus.status);//行驶中
	document.writeln(bus.getColor());//黄色
	document.writeln(bus.getDesc());//这是一辆公共汽车,颜色是黄色
	document.writeln(bus.getName());//公共汽车

###例4 扩展类、实例

	//CLASS.fn.extend 是扩展CLASS的原型方法属性
	//CLASS.extend 则是返回一个继承了CLASS类的子类
	//INSTANCE.extend 扩展实例的静态方法属性
	
	//该例子添加了 setColor 方法到 Bike 类的原型
	Bike.fn.extend({
		setColor:function(color){
			this.color=color;
		}
	}); 
	//该例子给bike对象添加了 `setName` 静态方法
	bike.extend({
		setName:function(name){
			this.name=name;
		}
	});
	
	var BikeSub=Bike.extend({
			getDesc:function(){
				return this._super()+',非常非常漂亮'
			}
		}); //等同于 createClass(Bike,{});
	var subbike=new BikeSub('漂亮的自行车');
	
	bike.setColor('白色');
	bike.setName('我的自行车');
	document.writeln(bike.name);//我的自行车
	document.writeln(bike.color);//白色
	new Bike('又一辆自行车').setColor('white'); //white 因为setColor是绑定到Bike的原型中的,所以所有基于Bike派生的实例都具有这个方法,下面的setName则不是,会报错
	try{new Bike('又一辆自行车').setName('我的自行车');}catch(e){document.writeln(e.message);} //TypeError: undefined is not a function.  
	
	document.writeln(subbike.getDesc());//这是一辆漂亮的自行车,非常非常漂亮

###例5 instanceof 检测

	//instanceof 适用于单继承情况检测,对于多继承,请使用 isInstanceof 方法
	document.writeln(car1 instanceof Car) //true
	document.writeln(bike instanceof Bike) //true
	document.writeln(bike instanceof Car) //true
	document.writeln(subbike instanceof Bike) //true
	document.writeln(subbike instanceof Car) //true
	document.writeln(bus instanceof Bus) //true
	document.writeln(bus instanceof Drive) //true Drive是默认被继承的父类,所以原生instanceof可以检测,但是Bike是通过复制属性方法形式继承的,所以原生instanceof或返回false
	document.writeln(bus instanceof Car) //false 同上
	document.writeln(bus instanceof Bike) //false 同上
	document.writeln(bus.isInstanceof(Bus)) //true 通过isInstanceof可以正确检测所有父类以及多重父类
	document.writeln(bus.isInstanceof(Car)) //true
	document.writeln(bus.isInstanceof(Bike)) //true
	document.writeln(bus.isInstanceof(Drive)) //true

以上代码的测试地址

http://u.boy.im/createClass