JavaScript原型链回顾
# 一、JS内置对象
所谓的内置对象 指的是:
JavaScript本身就自己有的对象 可以直接拿来就用。例如ArrayString等等。JavaScript一共有12内置对象
函数类型(10个)
StringNumberBooleanArrayFunctionDateRegExpErrorObjectEvent
函数类型 有
__proto__和prototype属性
对象类型(2个)
MathJSON
对象类型只有
__proto__属性

# 二、JS原型链
# 2.1 概述

- 每个函数都有
prototype属性,除了Function.prototype.bind(),该属性指向原型。 - 每个对象都有
__proto__属性,指向了创建该对象的构造函数的原型。其实这个属性指向了[[prototype]],但是[[prototype]]是内部属性,我们并不能访问到,所以使用__proto__来访问 - 对象可以通过 proto 来寻找不属于该对象的属性,
__proto__将对象连接起来组成了原型链
打开浏览器的控制面板,随便输入一个
JS内置的构造器函数,比如Array,控制台输出的是一个名为Array的函数体,这好像并没有什么稀奇的,但是,当你接着输入Array.prototype,控制面板输出了一堆我们经常用到的Array构造器的方法,把目光转移到最下方,有一个叫__proto__的属性,好奇的点开。列表列出的不是Object构造器的方法么,里边有我们非常熟悉的hasOwnProperty还有toString等方法。如果Array是构造器,那么控制面板输出的Array.prototype的所有属性中constructor又是什么构造器?点开看看,之后就像身处德罗斯特效应中一样,__proto__和constructor,还有Array构造器中常用的方法名不断的出现,一层套一层,一层层展开,没有尽头

拿
Array举例,Array.prototype中有一个constructor属性,这个属性的值就是Array构造器自己
Array.prototype.constructor === Array //true
@前端进阶之旅: 代码已经复制到剪贴板
# 2.2 prototype
这是一个显式原型属性,只有函数才拥有该属性。基本上所有函数都有这个属性,但是也有一个例外
let fun = Function.prototype.bind()
@前端进阶之旅: 代码已经复制到剪贴板
如果你以上述方法创建一个函数,那么可以发现这个函数是不具有
prototype属性的
# 2.2.1 prototype 如何产生的
当我们声明一个函数时,这个属性就被自动创建了