目录
一、原型
二、显式原型与隐式原型
三、原型链
四、注意点
我感觉原型链还是比较重要的,但是老师上课的时候一带而过,有点懵逼,所以在这里稍微概括一下,更复杂的图也没有在这里Po出来,但是这些应该够用,希望对大家有点用处。
一、原型
- 每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象);原型对象中有一个属性constructor,它指向函数对象。
- 给原型对象添加属性(一般都是方法)。作用:函数的所有实例对象自动拥有原型上的属性(方法)
图释:

代码:
假设有一个Date函数,那么 Date.prototype.constructor === Date
二、显式原型与隐式原型
- 每个函数function都有一个prototype,即显式原型(属性)
- 每个实例对象都有一个__proto__,可称为隐式原型(属性)
- 对象的隐式原型的值为其对应函数的显式原型的值 (函数.prototype === 实例对象.__proto__)
- 内存结构

总结:
- 构造函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象
- 实例对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
- 程序员能直接操作显式原型,但不能直接操作隐式原型(ES6之前)
三、原型链
访问一个对象的属性时,先在自身属性中查找,找到返回,如果没有,再沿着__proto__这条链向上查找,找到返回,如果最终没有找到,返回undefined。所以说原型链是一个隐式原型链,它的作用就是查找对象上的属性(方法)

四、注意点
- 函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
- 所有函数都是Function的实例(包含Function),因为所有的函数都是new Function出来的,所以所有函数的__proto__都一样
- Object的原型对象是原型链的尽头(Object.prototype.__proto__ = null)
- 一个函数即有显示属性也有隐式属性。
好啦,今天主要就是讲了一下原型、显示原型/隐式原型以及原型链,拜比~