浅聊一下原型和原型链

183 阅读1分钟

原型和原型链

1. 原型

__proto__,prototype这两个东西是什么?两者之间的联系?

  1. prototype是函数才有的属性。每个函数在创建时就会有一个prototype属性,名为 原型对象 。

  2. __proto__是实例对象的内部指针,指向构造函数原型。

  3. 联系:某实例对象的__proto__属性值等于它的构造函数的显式原型的prototype属性值。

例子说明:

var a =  function Name() {} //构造函数

let aa = new a() // 实例
  console.log(a.prototype);
  console.log(a.__proto__);
  console.log(aa.prototype);
  console.log(aa.__proto__);
  console.log(a.prototype === aa.__proto__);

在浏览器中打印结果如下:

image.png

2. 原型链

  1. 原型链,就是对象想使用某个属性时,首先从自己的构造函数中找,没有就继续从构造函数的原型对象(也就是prototype)中找,没有,继续,直到到原型的尽头null

    图片说明如下:

image.png

  1. 构造函数的prototype属性的constructor属性是自己(函数)
console.log(a.prototype.constructor); 

image.png


放上阮一峰老师关于继承机制的说法:

  • prototype属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象(prototype)里面,修改prototype对象的话会影响所有的实例对象。
  • 那些不需要共享的属性和方法,就放在构造函数(函数体)里面,修改prototype对象的话不会影响其他实例对象。
  • 实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。