likes
comments
collection
share

意(一)图让你原型(链)毕业

作者站长头像
站长
· 阅读数 55

原型呢 又分为显式原型和隐式原型 我觉得结合起来理解 会比较好

在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__ proto __)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型。函数是唯一具有显式原型的对象,但Function.prototype.bind()创建的函数不具有。(特例)

  • 显式原型:prototype is the object that is used to build __proto__ when you create an object with new. (用new创建对象时用来构建__proto__的对象)
  • 隐式原型: __ proto __ is the actual object that is used in the lookup chain to resolve methods, etc. (真正用来查找原型链去获取方法的对象。)
  • 那么我们来看看是否有了一定理解
person1.__proto__===person.prototype //true 
person.prototype.__proto__===Object.prototype //true 
Object.__proto__===Function.prototype //true 
Array.__proto__===Function.prototype //true 
Array.prototype.__proto__===Object.prototype //true

然后呢 我们来上一张图

意(一)图让你原型(链)毕业

怎么样 眼花缭乱了吧 我们来一步一步分析

  • 我们先看第一行

    • 第一行呢 有三个对象对吧, 中间的Foo函数、Foo的实例对象f1、Foo的原型对象
      • Foo--->Foo.prototype Foo是一个构造函数吧(大写)所以函数也就有了显式原型 Foo.prototype
      • Foo.prototype--->Foo 实例对象的隐式原型==构造函数的显式原型以此来说明实例对象的创造者constructor,也就是说,构造函数的显式原型有一个构造者指向构造函数本身。
      • Foo.prototype--proto-->Object.prototype那么显式原型也是一个对象,也有隐式原型,指向创造它的那位的显示原型,也就是Object.prototype
      • f1--proto-->Foo.prototype f1是实例对象,具有隐式原型,并且指向构造函数的显式原型
  • 看完第一行 是不是豁然开朗了 第二行(类似就不再赘述)

    • Object.prototype--proto->null 那Object的原型对象prototype也是一个对象,也指向构造它构造函数,但是族谱也有个头,所以就指向NUll了。
    • Object--prooto->Function.prototype 构造函数也是一个对象,它的隐式原型也指向创造它的对象的显式原型,而函数是由Function构造函数够造的。因此Foo--proto->Funtion.prototype 也是如此
  • 最后一行的与众不同

    • 唯一不同的就是Funtion--proto-->Function.prototype: 这里想到一个例子,人是人造的。因此 人的隐式原型指向人的显式原型。已经是最顶端了嘛。

最后

所有的对象都有原型嘛?

问出这个问题 当然就是也有极端份子了。 Object.create(null) 创建出来的对象,就没有原型

意(一)图让你原型(链)毕业

感谢阅读

转载自:https://juejin.cn/post/7376484708547690507
评论
请登录