JavaScript类式继承
为了更好的了解JavaScript中类式继承的原理,我们先看一个简单的例子。
下面来看具体分解:
- 在子类的构造函数中Person.call(this);这就话的作用就是调用父类的构造函数。
- reader.prototype = new Person();把父类的一个实例对象赋给子类的prototype对象,这样使得子类能够拥有父类的所有属性和方法。
- reader.prototype.constructor=reader;由于子类的构造函数被覆盖,所以需要重置构造函数。
如果使用这种方法声明一个子类,复杂又啰嗦。为了使得声明一个子类变得简单,我们把上面的三步放到一个方法中,如下所示:
具体说明都在注释中,不再详解。
那么下面我们来看,刚开始的例子中子类如何声明:
ok,现在是不是已经简单很多了,但是我们还发现一个问题,在子类的声明中耦合了父类的类名,为了解耦,下面我们来看看extend方法的一个版本:
下面我们来看看这个这样使用该方法,子类是如何声明的:
ok,上面就是类式继承的整个过程,是不是很简单?下面来看原型继承:
JavaScript 原型继承
在使用原型式继承时,最好忘掉关于类和实例的一切知识。用基于类的办法创建对象包括两个步骤
1.用一个类的声明定义对象的结构。
2.实例化该类为创建一个新对象。用这种方式创建的对象都有一套该类的所有示例属性的副本,每一个示例方法都只存在一 份,但每一个对象都有一个指向它的链接。
使用原型继承时,不需要使用类来定义对象的结构,只需直接创建一个字面对象即可。这个对象随后可以被新的对象重用,这得益于原型链查找的工作机制。
为了能够更清楚的明白这个原理:
我们也先来看一个例子:
我们看到在上面的例子中,我们用到了一个create函数,通过使用这个create函数,就会生成父类的一个子类,那么这个子类是如何实现的呢???请看下面:
该函数的具体解释,已经在注释中,下面我们来看看该函数的两个变体:
下面是另一个变体:
具体不再解释,想必大家肯定都已经明白了,如果不太明白,在好好看看那本犀牛书。
上面的文章如果有不妥之处,希望大家多多执政。