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中的方法了(其实就是包含了属性)。