Js面向对象原型链(继承)

112 阅读2分钟

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