javascript面向对象编程--定义类(推荐使用构造函数原型模式定义类,次之动态原型模式)

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)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值