javascript是基于原型继承的机制来实现面向对象编程的。例如,对象直接量继承于Object.prototype,函数对象继承于Function.prototype,而prototype对象本身也继承于Object.prototype
在javascript中,
如果类型相同或相近,则可以使用继承来抽象;
如果类型不同,而功能相似则可以用接口来描述;
如果一组类型都具有某种相似性,那么可以使用原型来概括;
如果类型完全不相同,但是仍然可以使用工厂来联系他们;
认识类----类主要借助两中方法来实现----归纳法和演绎法
归纳法:由特殊到一般,比如把能够自由活动的归类为动物,不能自由活动归类为植物
演绎法:由一般到特殊,比如把同类的事物根据不同的特征分成不同的小类,动物可以分成猫科动物,猫科动物细分为猫,猫又分白猫 黑猫 花猫
类成员描述了类内部的各种事物,如常量、字段、构造器、方法、属性、事件、操作符、重载、类型等
javascript是弱类型,只定义了基本成员:属性 方法
面向对象开发 基于:系统应由对象来创建,对象拥有数据和功能。属性定义数据么人方法定义功能
类的本质是抽象,抽象是一个分析的过程,即定义和要完成的事情的过程
类的三个基本特性:继承 封装 和 多态
继承 描述了类型关系,不同类之间经常存在相似性,两个以上的类也会经常共享相同属性和方法,利用继承机制可以快速的实现代码的‘复制和粘贴’
封装描述了类的独立性,用户知道如何使用类型即可,不关心内部机制和实现,只要类型接口没有变化,对系统中一个功能改变不会对整个系统造成影响
多态描述了类型的宽容性:通过多态,可以在事先不知道对象的类型就于它进行协作,即使类型不同,而类能帮助处理这些问题
定义类:5种方法---工厂模式 构造函数模式 原型模式 构造函数原型模式 动态原型模式
Object 、Fucntion、Array、RegExp、String等内置对象都是类,也称构造函数
第一种:工厂模式创建类---使用new Object
function showColor(){ console.log(this.color)}//放在外面,创建的对象事例共享同一个函数,避免重复创建函数
function createCar(a,b,c){
var tempCar=new Object;
tempCar.color=a;
tempCar.doors=b;
tempCar.mpg=c;
tempCar.showColor=showColor;
return tempCar
}
var Car1=createCar('red',4,23)
var Car2=createCar('bule',3,25)
第二种:构造函数模式
在javascript中Object 、Fucntion、Array、RegExp、String等内置对象都是构造函数,使用new调用他们,并初始化为一个个对象实例---构造函数 有this没有 return ,普通函数可以有 return,没有this
function Book(a,b){
this.a=a;
this.b=b;
this.what=function(){
alert(this.a+this.b)
}
}
var book1=new Book('javascrip',160)
第三种:原型模式:在构造函数对象中定义prototype属性之后,则任何实例对象都将拥有prototype属性
function Book(){}//声明一个空构造函数
Book.prototype.a='javascript';
Book.prototype.b=200;
Book.prototype.what=function(){
alert(this.a+this.b)
}
var book1=new Book(); //缺点1,无法通过构造函数参数向原型属性动态传递值
alert(book1.a)//缺点2,但原型属性值为引用类型数据,改变对象实例中的属性值,会影响所有实例的属性值
注意:prototype是构造函数的属性,而不是对象属性,而javascript的内置对象都是构造函数,所以
var o=new Object();
o.prototype.a='javascript' //错误,该对象是没有prototype属性
Object.protptype.a='javascript'//正确,javascript内置对象是构造函数,所以有prototype属性
第四种:构造函数原型模式-----应用最广泛,解决了原型模式构造函数不能传值,和修改引用类型属性值 影响所有实例的问题
function Book(a,b){//构造函数模式设计
this.a=a;
this.b=b;
}
Book.prototype.what=function(){ //原型模式设计
alert(this.a+this.b)
}
var book1=new Book('javascript',160)
第五种:动态原型模式:性能等价 构造函数原型模式
function Book(a,b){//构造函数模式设计
this.a=a;
this.b=b;
if(typeof Book.isLock=='undefined'){//如果没有创建过原型方法,则创建
Book.prototype.what=function(){
alert(this.a+this.b)
};
Book.isLock=true;//创建原型方法后,锁上,避免重复创建
}
}
var book1=new Book('javascript',160)