您的位置:首页 > Web前端 > JavaScript

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 继承 对象