深入理解js原型与原型链

技术分享
244 0

在JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。

但这里需要区分下Function(函数对象)和Object(普通对象):

function animal() {}; // 函数对象
  const f = new Function (); // 函数对象
  const a = new animal() // 普通对象
  const b = {} // 普通对象

凡是通过Function创建的对象都是函数对象,其他则都是为普通对象

好的,继续看下面:

这里定义了一个animal构造函数

function animal(name,age) {
     this.name = name;
     this.age = age;
  }
  console.log(animal.prototype)

1、每一个函数对象在被创建的时候都会有一个prototype属性,这个属性指向他的原型对象(原型)。

2、原型对象上又会有一个constructor属性和__proto__属性,这个constructor属性又会指向它的构造函数,这个__proto__属性指向的是它的构造函数的原型对象。

即animal.prototype.constructor = animal

下面通过animal构造函数实例化一个对象f1

const f1 = new animal('dog',2) // 实例化对象
  console.log(f1)

这个f1对象也有一个_proto_属性,这个属性指向他的构造函数的原型对象。

即f1.__proto__ === animal.prototype

1、__proto__和constructor是对象所独有的

2、prototype是函数所独有的

前面说到了所有的对象都有__proto__属性,并且是指向它的原型对象(父对象)。当我们在本身查找一个属性时,如果对象本身不存在就会去__proto__指向的原型对象中去寻找,如果找不到,则继续向上寻找直到null,这便形成了一条原型链。且原型链的终点都是null。

console.log(f1.__proto__.__proto__.__proto__)

为什么是null?

null: Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。

undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。

显然,Object.prototype 没有进一步的原型并不是一种错误,并且对象如果有原型的话,应该是一个对象,因此没有原型应该以 null 表示,而不是以 undefined 表示。

最后更新 2021-12-12
评论 ( 0 )
OωO
隐私评论