js继承之原型链继承

面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是经过原型链的方法。html

 

1、构造函数、原型与实例之间的关系

每建立一个函数,该函数就会自动带有一个 prototype 属性。该属性是个指针,指向了一个对象,咱们称之为 原型对象。什么是指针?指针就比如学生的学号,原型对象则是那个学生。咱们经过学号找到惟一的那个学生。假设忽然,指针设置 null, 学号重置空了,不要慌,对象还存在,学生也没消失。只是很差找了。编程

  原型对象上默认有一个属性 constructor,该属性也是一个指针,指向其相关联的构造函数。函数

  经过调用构造函数产生的实例,都有一个内部属性,指向了原型对象。因此实例可以访问原型对象上的全部属性和方法。this

  

  因此三者的关系是,每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。通俗点说就是,实例经过内部指针能够访问到原型对象,原型对象经过constructor指针,又能够找到构造函数。spa

  下面看一个例子:prototype

 

function Dog (name) {
    this.name = name;
    this.type = 'Dog'; 
}
Dog.prototype.speak = function () {
  alert('wang');
}
var doggie = new Dog('jiwawa');
doggie.speak();  //wang 

 

以上代码定义了一个构造函数 Dog(),  Dog.prototype 指向的原型对象,其自带的属性construtor又指回了 Dog,即  Dog.prototype.constructor == Dog. 实例doggie因为其内部指针指向了该原型对象,因此能够访问到 speak方法。3d

Dog.prototype 只是一个指针,指向的是原型对象,可是这个原型对象并不特别,它也只是一个普通对象。假设说,这时候,咱们让 Dog.protptype 再也不指向最初的原型对象,而是另外一个类 (Animal)的实例,状况会怎样呢?指针

 

 2、原型链code

前面咱们说到,全部的实例有一个内部指针,指向它的原型对象,而且能够访问原型对象上的全部属性和方法。doggie实例指向了Dog的原型对象,能够访问Dog原型对象上的全部属性和方法;若是Dog原型对象变成了某一个类的实例 aaa,这个实例又会指向一个新的原型对象 AAA,那么 doggie 此时就能访问 aaa 的实例属性和 AA A原型对象上的全部属性和方法了。同理,新的原型对象AAA碰巧又是另一个对象的实例bbb,这个实例bbb又会指向新的原型对象 BBB,那么doggie此时就能访问 bbb 的实例属性和 BBB 原型对象上的全部属性和方法了。htm

  这就是JS经过原型链实现继承的方法了。看下面一个例子:

//定义一个 Animal 构造函数,做为 Dog 的父类
function Animal () {
    this.superType = 'Animal';
}

Animal.prototype.superSpeak = function () {
    alert(this.superType);
}

function Dog (name) {
    this.name = name;
    this.type = 'Dog';  
}
//改变Dog的prototype指针,指向一个 Animal 实例
Dog.prototype = new Animal();
//上面那行就至关于这么写
//var animal = new Animal();
//Dog.prototype = animal;

Dog.prototype.speak = function () {
  alert(this.type);
}
var doggie = new Dog('jiwawa');
doggie.superSpeak();  //Animal

解释一下。以上代码,首先定义了一个 Animal 构造函数,经过new Animal()获得实例,会包含一个实例属性 superType 和一个原型属性 superSpeak。另外又定义了一个Dog构造函数。而后状况发生变化,代码中加粗那一行,将Dog的原型对象覆盖成了 animal 实例。当 doggie 去访问superSpeak属性时,js会先在doggie的实例属性中查找,发现找不到,而后,js就会去doggie 的原型对象上去找,doggie的原型对象已经被咱们改为了一个animal实例,那就是去animal实例上去找。先找animal的实例属性,发现仍是没有 superSpeack, 最后去 animal 的原型对象上去找,诶,这才找到。

 

 这就说明,咱们能够经过原型链的方式,实现 Dog 继承 Animal 的全部属性和方法。

总结来讲:就是当重写了Dog.prototype指向的原型对象后,实例的内部指针也发生了改变,指向了新的原型对象,而后就能实现类与类之间的继承了。(可是若是在重写原型对象以前,产生的实例,其内部指针指向的仍是最初的原型对象。

原文连接:https://www.cnblogs.com/sarahwang/p/6870072.html

相关文章
相关标签/搜索