20120112继承 js

有很多时间我都想将js的继承方法好好的总结一下,可一直就是没有时间,总结的怎么样,也就见仁见智了。

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

在js中模拟继承有多种方法,其中寄生组合模式是一种比较容易简单的模拟继承模式,下面是一个例子:

  js的继承包括属性的继承和方法的继承,他们分别通过不同的方法来实现。

 1、属性的继承

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

     我们首先创建一个animal"类"(实际上就是一个function函数对象)  

funciton animal(name){
    this.name=name;
}
function lion(){
     animal.apply(this,["狮子"]);
}

 这里使用了animal的apply方法,把animal的执行环境改成lion被调用时的执行环境。

 这里要解释一下,我们如果想使用lion这个“类”,通常需要new一个lion。如:

   var obj = new lion();

 而new 关键字做了一下工作:

    1、开辟堆空间,已准备存储lion对象

    2、修改lion对象本身的执行环境,是的lion函数的this指向了lion函数对象本省。

    3、调用lion“类”的“构造函数”,创建lion对象

    4、将lion函数对象的堆地址赋给变量obj,这个时候obj就指向了这个lion函数对象

  所以经过new关键字以后,animal.apply(this,["狮子"])中的this就已经指向lion对象啦

2、方法的继承

    在js中每个“类”(即函数,注意不是函数对象)都有一个prototype属性,prototype表示函数的原型,也表示一个类的成员的集合(通常是方法的集合)。我们可以通过函数的prototype属性来实现方法的继承

     我们同样首先创建一个animal“类”

funciton animal(name){
     this.name = name;
}
animal.prototype.eat = function(){
     alert("去吃饭啦。。")
}
function lion(){
     animal.apply(this,["狮子"])
//animal.all(this,["狮子"])
 } //注意下面的代码,我们马上要完成方法的继承了 lion.prototype = new animal();

 这样就把animal函数对象存储在了lion的原型中了,lion也就包含了animal中的方法了(其实就是包含了属性)。

原文地址:https://www.cnblogs.com/GenghisKhan/p/2320368.html