电脑技术学习

javascript中关于类继承的讲解

dn001

  前面多次提到JavaScript中没有类的概念,与类相关的继承的概念更是无从谈起,但是我们可以通过特殊的语法来模拟面向对象语言中的继承。

  JS继承

  JavaScript中没有类的概念,与类相关的继承的概念更是无从谈起,但是我们可以通过特殊的语法来模拟面向对象语言中的继承。在JS中模拟继承有多种方式,其中寄生组合模式是一种比较容易简单的模拟继承模式,下面我们就来介绍一下用寄生组合模式模拟继承。JS的继承包括属性的继承和方法的继承,他们分别通过不同的方法来实现。

  1、属性的继承

  属性的继承通过改变函数的执行环境来实现的。而改变函数的执行环境可以使用call()和apply()两种方法来实现。

  我们首先创建一个Animal“类(因为JS中没有类的概念,这里只是一个模拟,它实际上只是一个Function函数对象)。
   function Animal(name){
   this.name=name;
  }
再创建一个Lion“类,“继承于Animal
  function Lion(){
   Animal.apply(this, ["狮子"]);
   }

这里使用了Animal的apply方法,把Animal的执行环境改成Lion被调用时的执行环境。这里要解释一下,我们要想使用Lion这个“类,通常需要new一个Lion。如:
       var l = new Lion();
而new关键字是十分伟大的,在上段代码中,new关键字完成了以下几项工作:
  1)开辟堆空间,以准备存储Lion对象
  2)修改Lion对象本身的执行环境,使得Lion函数的this指向了Lion函数对象本身。
  3)调用Lion“类的“构造函数,创建Lion对象
  4)将Lion函数对象的堆地址赋值给变量l,这个时候l就指向了这个Lion函数对象,所以经过new关键字以后Animal.apply(this, ["狮子"])中的this已经指向了Lion函数对象本身了,所以这段代码就将Animal函数的执行环境改变成了Lion函数中,相当于以下代码:
  function Lion(){
  function Animal(name){
  this.name=name;
   }
  }
而此时的this已经是Lion函数对象了所以上段代码进一步相当于:
  function Lion(){
   this.name=name;
  }
这样就给Lion函数对象添加了name属性,也模拟了Lion函数继承于Animal函数的效果。