您现在的位置是:首页>学习分享
深入理解js原型与原型链 2019-09-09 35

  在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?

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

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

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

文章评论
关注我们
  • 微信公众号
  • 我的微信

站点声明:

1、本网站文章部分出自互联网,如无意中侵犯了某个媒体或个人的知识产权,请来信(987354940@qq.com)告之,本网站将立即删除。

Copyright © www.zhangqingblog.com All Rights Reserved. 备案号:鄂ICP备18005731号-2