关于组合式继承和寄生式继承的个人理解

---恢复内容开始---

  这是我第一次在博客园认真写博客,也是第一次认真写技术博客,发表下个人见解,望大家不吝赐教!

  首先介绍下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();
View Code

用Chrome跟踪,可以看到这样的关系,如下图:

从图中,我们可以看到,A的prototype属性已经指向了B对象的实例,B对象中又有b成员。constructor因为经过重新指向了A,所以这里看到的constructor是A。这个属性是指向构造函数的。这个时候,A对象就继承了B对象的所有属性。而在B对象中,我们又可以看到这样属性等。这里,B对象的prototype指向的Object。也就是说B对象的父类,是Object。

 

posted on 2016-05-25 19:52  drafire  阅读(568)  评论(0编辑  收藏  举报