Javascript原型继承

     继承机制一直是面向对象语言中最为人津津乐道的概念。在一边的面向对象语言中(java),支持两种继承方式:接口继承,实现继承。

     javascript作为一种弱类型语言,其语法和设计,和面向对象语言有一定的区别,但就继承来说,js实现继承主要是依赖原型链实现的。其基本思想是利用原型链让一个引用型继承另一个引用类型的属性和方法。

原型链

     我们知道每个构造函数(比如 function Person(){....})都有一个原型对象(Person Prototype);

     每一个原型对象,都包含一个constructor指针,指向构造函数(Person);

     而,每个实例都包含一个指向原型对象的内部指针([Prototype],有些书和博客叫_proto_)。

     知道上面的概念后,我们让原型对象等于另一个类型的实例;那么原型对象将包含一个指向另一个原型的指针,相应,让另一个原型中也包含一个指向另一个构造函数的指针;如果我们让另一个原型又是另一个类型的实例,那么层层递进,就构成了实例与原型之间的链式关系,就是所谓的“原型链”。

     比如像下图一样:

wKiom1RGetij6-FKAAF68tISv-o824.jpg 

继承

     js继承的原理就是利用原型链,来访问其他对象的方法属性。下面举一个例子(javascript高级程序设计第三版第163页);实现继承的基本模式大致如下:

function SuperType() { this.property = true; }; SuperType.prototype.getSuperValue = function() { return this.property; } function SubType() { this.subproperty = false; } //继承 SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function() { return this.subproperty; }; var instance = new SubType(); alert(instance.getSuperValue());//返回true

    以上代码代码定义了两个类型:SuperType和Subtype,以及每个类型的属性和方法;

之后让SubType.prototype = new SuperType();实际上相当于重现原型对象,代之以SuperType的一个实例;那么原来存在于superType实例中的所有方法和属性;也存在于SubType.Prototype中了;之后再给SubType.Prototype新怎一个方法,相当于子类拓展自己的方法。上面例子中实例,构造函数,原型对象之间的关系如下图所示。

wKiom1RGhtPx8qvXAAE4xsqY91w512.jpg

    我们知道所有的引用类型默认都继承了Object,这个继承夜市通过原型链实现的;所以上述图片的描述还少了一个环节;大家要记住,所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针[Prototype](也作_proto_),指向Object.prototype。所以,我们自定义的类型调用的toString(),valueOf()方法,实际上来自于Object.prototype。结合上面的例子,画出了完整的原型链示意图,如下所示:

wKiom1RGhtSTyxU5AAH6Tq1N9XM737.jpg



  


   

你可能感兴趣的:(继承,js原型)