五分钟理解:JS原型对象与原型链

一、原型对象和原型链到底是什么?

要知道原型对象就得先了解在JS中什么是对象:JavaScript 对象是被命名值的容器

// 这段代码将一个单一值vehicle赋给car这个变量
let car = "vehicle";
复制代码

对象也是变量。但是对象包含很多值:

// 这段代码把多个值(vehicle, hongqi, black)赋给名为 car 的变量:
let car = {type:"vehicle", model:"hongqi", color:"black"};
复制代码

搞清楚什么是对象之后我们继续聊,在此处我想引用一段MDN文档里的定义:
JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。

二、通过一个简单的小栗子来说明它们的关系

首先应该理解两个概念

  1. JS中的对象都内置了__proto__属性,但是只有函数对象内置了prototype属性
  2. 以下包含Object和Function以及Data、Math、Array、String、Number、Boolean、RegExp在内的函数都是JS的内置函数
  function Animal(name, age) {
    this.name = name;
    this.age = age;
  };
  console.log(Animal.prototype);
  // 在原型对象上定义公共方法say
  Animal.prototype.say = function (){
    console.log('say');
  }
  // 实例化一个对象ani
  let ani = new Animal('xiaobai', 8);
  let ani1 = new Animal();
  let ani2 = new Animal();
  console.log(ani);
复制代码

image.png

可以看到:对象Animal的原型对象Animal.prototype内置的prototype属性内包含constructor属性和__proto__属性

  • 值得注意的是constructor指向定义的函数对象Animal
  • 函数对象也通过prototype与它的原型对象关联起来了

那么现在读者可能有一个疑问:实例化出来的对象ani怎么与函数原型对象来进行关联呢,还记得刚才说的__proto__吧,那么就是通过它来找到函数原型对象了。我们当然可以不止实例化一个对象,如果有需要,我们可以实例化1个、2个甚至100个对象。这么多对象都可以通过__proto__来找到函数原型对象,这也就可以理解为所谓的原型链了。

image.png

这里就是我们ani打印出来的结果了


至此,我们可以通过一张图来小小地总结一下原型对象和原型链的概念与联系
在这里还有一个点是我刚才没说的,原型链的终点就是Object.prototype,原型对象一层一层地指向直至指到它为止,而Object.prototype指向Null

原型链.png

三、结语

本文也只是简略地谈了一下原型对象和原型链相关的概念,里面还有很多内容无法一次说完,本人也是前端小白,如有不妥希望大佬给予指导,感谢!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享