1,面向对象程序设计
1)创建对象
工厂模式:
function factory(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.say=function(){
alert('hi')
}
}
构造函数模式
function Build(name,age){
this.name=name;
this.age=age;
this.say=function(){
alert('hi')
}
}
原型模式
function Build(){};
Build.prototype.name='mocy';
Build.prototype.age=25;
Build.prototype.say=function(){alert('hi')};
构造函数+原型模式
function Build(name,age){
this.name=name;
this.age=age
}
}
Build.prototype.say=function(){alert('hi')}
动态原型模式
function Build(name,age){
this.name=name;
this.age=age;
if(typeof this.say!="function"){
Build.prototype.say=function(){alert('hi')}
}//这条语句在第一个次实例化的时候初始化原型,以后再也不执行,say方法已存在原型上
}
}
寄生构造模式
function SpecialArray(){
var arr=new Array();
arr.push.apply(arr,arguments);
arr.toString=function(){
return this.join("|")
}
return arr
}
常用于为特殊对象创建构造函数。比如特殊的数组,不好直接修改Array。
2)继承
原型链继承//存在引用类型属性共享问题
function Super(){
this.color=['red','green','blue']
}
function Sub(){
}
Sub.prototype=new Super();
var s1=new Sub();
s1.color.push('black');
s1.color//['red','green','blue','black']
var s2=new Sub();
s2.color//['red','green','blue','black']
借用构造函数//父类原型上方法对子类而言不可见
function Super(){
this.color=['red','green','blue']
}
Super.prototype.say=function(){
alert(1)
}
function Sub(){
Super.call(this);//借用继承
}
var s1=new Sub();
s1.color.push('black');
s1.color//['red','green','blue','black']
var s2=new Sub();
s2.color//['red','green','blue']
组合继承//
function Super(name){
this.name=name;
this.colors=['red','green','blue']
}
Super.prototype.sayName=function(){alert(this.name)}
function Sub(name,age){
Super.call(this,name);//借用继承,实现实例对象独有属性,且传参到Super超类
this.age=age;
}
Sub.prototype=new Super();//原型链继承,实现实例共享父类方法
Sub.prototype.sayAge=function(){}//定义子类自己原型方法