模拟重载
function Person(){
var args=arguments;
if(typeof args[0]==='object'&&args[0]){ //这里还要防止args[]为null的情况,因为null也为Object
if(args[0].name){
this.name=args[0].name;
}
if(args[0].age){
this.age=args[0].age;
}
}else{
if(args[0]){
this.name=args[0];
}
if(args[1]){
this.age=args[1];
}
}
}
Person.prototype.toString=function(){
return 'name= '+this.name+',age= '+this.age;
}
var bosn=new Person('Bosn',27);
console.log(bosn.toString()); //name= Bosn,age= 27
var nunn=new Person({name:'Nunn',age:38});
console.log(nunn.toString()); //name= Nunn,age= 38
调用基类方法
function Person(name) {
this.name=name;
}
function Student(name,className){
this.className=className;
Person.call(this,name); //调用基类构造器
}
var bosn=new Student('Bosn','Network064');
console.log(bosn); //Student{className:"Network064",name:"Bosn"}, 基类与子类都被正确地初始化
Person.prototype.init=function(){};
Student.prototype.init=function(){
Person.prototype.init.apply(this,arguments); //调用基类方法
};
链式调用
function ClassManager(){}
ClassManager.prototype.addClass=function(str){
console.log('Class:'+str+'added.');
return this;
//ClassManager{} 返回ClassManager的实例,所以每次调用完后,可继续调用,实现了链式调用
};
var manager=new ClassManager();
manager.addClass('classA').addClass('classB').addClass('classC');
//Class:classAadded.
//Class:classBadded.
//Class:classCadded.
^抽象类
function DetectorBase(){
throw new Error('Abstract class can not be invoked directly!');
}
DetectorBase.detect=function(){console.log('Detection starting...');};
DetectorBase.stop=function(){console.log('Detector stopped.');};
DetectorBase.init=function(){throw new Error('Error');};
function LinkDetector(){}
LinkDetector.prototype=Object.create(DetectorBase.prototype);
LinkDetector.prototype.constructor=LinkDetector;
模块化
简单实例1
var moduleA;
moduleA=function(){
var prop=1;
function func(){}
return{
func:func,
prop:prop
}
}(); //利用模块化,将变量及方法封装在对象中,使它们不泄露在全局作用域里
实例2:
var moduleA;
moduleA=new function(){
var prop=1;
function func(){}
this.func=func;
this.prop=prop;
};