关于组合式继承和寄生式继承的个人理解
---恢复内容开始---
这是我第一次在博客园认真写博客,也是第一次认真写技术博客,发表下个人见解,望大家不吝赐教!
首先介绍下js的继承。很多OO语言,如C#,都支持接口继承和实现继承。但是由于在js中,函数是没有签名的(没有签名也导致了js中没有重载的概念。原因简单的说,就是函数的签名是存在一个数组Argument中的),所以js只支持实现继承。而js的继承主要依靠原型链(ps:摘抄《Javascript高级程序设计》)
简单说下原型链。原型链的实现方式,在于把对象a 的prototype属性指向一个对象b。这样,a对象就继承了b对象。
换句话说,a对象是b对象的子类。如果b对象的prototype又指向一个对象c,那么a、b、c、Object这些实例和原型组成的链条,就是原型链。所有对象的终极父类,又叫超类,都是Object。简单代码如下:
1 function A() { 2 this.a = "a"; 3 } 4 A.prototype = new B(); //这里要注意,这是new B(),不是B 5 A.prototype.constructor = A; //如果这里不指定,这里将指向超类。因为继承重写了constructor属性 6 function B() { 7 this.b = "b"; 8 } 9 10 var instance = new A();
用Chrome跟踪,可以看到这样的关系,如下图:
从图中,我们可以看到,A的prototype属性已经指向了B对象的实例,B对象中又有b成员。constructor因为经过重新指向了A,所以这里看到的constructor是A。这个属性是指向构造函数的。这个时候,A对象就继承了B对象的所有属性。而在B对象中,我们又可以看到这样属性等。这里,B对象的prototype指向的Object。也就是说B对象的父类,是Object。