JavaScript中的继承详解
2017-08-19 16:00
239 查看
继承
许多OO语言都支持两种继承方式:接口继承和实现继承,接口继承只继承方法签名,而实现继承则继承实际的方法。ECMAScript只支持实现继承,而且其实现继承主要依靠原型链来实现的。原型链
利用原型让一个引用类型继承另一个引用类型的属性和方法。每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,我们让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针,另一个原型中也包含指向另一个构造函数的指针。例如:function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; }; function SubType(){ this.subproperty = false; } SubType.prototype = new SuperType(); Sub.prototype.getSubValue = function(){ return this.subproperty; }; var instance = new SubType(); alert(instance.getSuperValue); //true
SubType继承了SuperType,而继承是通过创建SuperType的实例并将该实例赋给SubType.prototype实现的。实现的本质是重写原型对象,代之以一个新类型的实例,原来存在于SuperType的实例中所有属性和方法,现在也存在于SubType.prototype中了。
调用instance.getSuperValue()会经历3个步骤:1、搜索实例;2、搜索SubType.prototype;3、搜索SuperType.prototype,最后一步会找到该方法。
完整的原型链
确定原型与实例的关系
第一种,使用instance操作符,只要用这个操作符测试实例与原型链中出现过的构造函数,就会返回true。
alert(instance instanceof SubType); //true
第二种,使用isPrototypeOf()方法,只要原型链中出现过的原型,都可以说是该原型链所派生的实例的原型。
alert(SubType.prototype.isPrototypeOf(instance)); //true
谨慎地定义方法
子类型有时需要覆盖超类型中的某个方法,或者需要添加超类型中不存在地某个方法,但不管怎样,给原型添加方法地代码一定要放在替换原型地语句之后。
通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会重写原型链。
原型链的问题
包含引用类型值的原型属性会被所有实例共享,在通过原型链来实现继承时,原型实际上会变成另一个类型的实例,于是,原先的实例属性也就顺理成章地变成了现在地原型属性了。
在创建子类型的实例时,不能向超类型的构造函数中传递参数。
组合继承
组合继承是最常用的继承模式,有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者长处的一种继承方式。其背后的思想是,使用原型链实现对原型属性和方法的继承,而通过借用构造函数实现对实例属性的继承。例如:function SuperType(){ this.name = name; this.colors = ["red","blue","green"]; } SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(name,age){ SuperType.call(this,name); //继承属性 this.age = age; } SubType.prototype = new SuperType();//继承方法 SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function(){ alert(this.age); }; var instance1 = new SubType("Nicholas",29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas" instance1.sayAge(); //29 var instance2 = new SubType("Greg",27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg" instance2.sayAge(); //27
相关文章推荐
- JavaScript继承详解(二)
- Javascript中的原型继承详解
- JavaScript 继承详解及示例代码
- JavaScript继承详解(一)
- JavaScript继承详解(五)
- JavaScript继承详解(二)
- JavaScript中继承方式详解
- JavaScript继承详解
- Javascript继承机制详解
- JavaScript中的继承方式详解
- javascript创建对象、对象继承的实用方式详解
- JavaScript 继承详解(二)
- JavaScript继承详解(五)
- javascript继承 详解~~(对象冒充的方式)
- JavaScript继承详解(三)
- JavaScript继承方式详解
- [置顶] Javascript面向对象继承prototype详解
- JavaScript继承详解(二)
- JavaScript继承详解(三)
- [JavaScript]类之三---详解javascript类继承机制的原理