1,原型链的构成思想
ECMA-262将原型链继承定义为ECMAScript的主要继承方式。根本思想就是通过原型链继承多个引用类型的属性和方法,即:每个函数都有一个原型对象,原型对象有一个属性指向构造函数,而实例则有一个内部指针指向原型链。如果原型链是另一个原型的实例,那就意味着这个原型本身有一个内部指针指向另一个原型,相应另一个原型也有一个指针指向另一个构造函数。这样就可以在实例和原型之间构造出一条原型链
实现原型链代码演示:
function SuperType(){
this.porperty = true
}
SuperType.prototype.getSuperValue = function(){
return this.porperty
}
function SubType() {
this.subproperty = false
}
//继承SuperType 原型链上的 getSuperValue SubType.prototype= new SuperType()
SubType.prototype.getSubValue = function(){
return this.subproperty
}
let instance = new SubType()
console.log(instanch.getSuperValue()) //返回false
上述代码定义了两个类型 SuperType 和 SubType 两个类型分别定于了一个方法一个属性,通过对SuperType原型链的继承使得SubType可以直接使用SuperType原型链上的getSuperValue方法。
2,原型的默认类值
默认情况下原型链都继承自Object ,任何函数的默认原型都是一个Object 实例,意味着所有实例都有一个内部指针指向Object.prototype。所以这就是为什么自定义类型可以继承包括toString(),valueOf()在内的所有的默认方法的原因。
3,原型链与继承
原型链与实例的关系可以通过两种方式确定。第一种使用instanceof操作符,如包含对应构造函数则返回true,否则返回。第二种方式就是使用isPrototypeof()方法,原型链上所有的原型都可以调用该方法,只要有包含关系就返回true
4,原型链方法
子类有时候需要覆盖父类的方法,或者新增方法,所以必须在原型赋值之后再追加到原型链上,例:
function SuperType(){
this.property = true
}
SuperType.prototype.getSuperValue = function(){
return this.property
}
function SubType(){
this.subProperty = false
}
//继承
SubType.prototype = new SuperType()
//追加新方法
SubType.prototype.getSubValues = function(){
return this.subProperty
}
//覆盖已有的方法
SubType.prototype.getSuperValue = function(){
return false
}
let instance = new SubType()
console.log(instance.getSuperValue) //false