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

【JavaScript学习】面向对象的程序设计(3):原型链继承

2017-09-28 16:28 816 查看
ECMAScript只支持实现继承(继承实际的方法),主要依靠原型链来实现。

原型链

基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。

function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};

function SubType(){
this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function(){
return this.subproperty;
};

var instance = new SubType();
alert(instance.getSuperValue());   //true


实现的本质是重写原型对象,代之以一个新类型的实例。

即,原来存在于SuperType的实例中的所有属性和方法,现在也存在与SubType.prototype中了。

确定了继承关系之后,给SubType.prototype添加了一个方法,这样就在继承了SuperType的属性和方法的基础上又添加了一个新方法。

子类型有时要覆盖超类型中的某个方法,或者需要添加超类型中不存在的某个方法。

——给原型添加方法的代码一定要放在替换原型的语句之后。

function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};

function SubType(){
this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

//添加新方法
SubType.prototype.getSubValue = function(){
return this.subproperty;
};
//重写超类型中的方法
SubType.prototype.getSuperValue = function(){
return false;
};

var instance = new SubType();
alert(instance.getSuperValue());  //false


通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样做会重写原型链。

function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};

function SubType(){
this.subproperty = false;
}

//继承了SuperType
SubType.prototype = new SuperType();

//使用字面量添加新方法,会导致上一行代码无效
SubType.prototype = {
getSubValue : function(){
return this.subproperty;
}
};

var instance = new SubType();
alert(instance.getSuperValue());  //error


缺点:

1、包含引用类型值的原型的继承会出问题。

function SuperType(){
this.color=["red","blue","green"];
}

function SubType(){
}

//继承了SuperType
SubType.prototype = new SuperType();

var instance1 = new SubType();
instance1.color.push("black");
alert(instance1.color);         //"red,blue,green,black"

var instance2 = new SubType();
alert(instance2.color);         //red,blue,green,black


2、创建子类型的实例时,没有办法在不影响所有对象实例的情况下,给超类的构造函数传递参数。

实践中会很少单独使用原型链!!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: