# 写在前面
首先我们需要明确两点:
1️⃣__proto__和constructor是对象独有的
2️⃣prototype属性是函数独有的
# 原型
# prototype
- 在最新ES规范里,prototype 被定义为:给其它对象提供共享属性的对象。
- 也就是说,prototype 自己也是对象,只是被用以承担某个职能罢了。
因此,prototype 描述的是两个对象之间的某种关系(其中一个,为另一个提供属性访问权限)。
# constructor与prototype联系
-
每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象)
-
原型对象中有一个属性constructor,它指向函数对象
-
给原型对象添加属性(一般是方法)
- 作用:函数的所有实例对象自动拥有原型中的属性(方法)
下面通过一个例子来说明:
function Demo() {}
console.log(Demo.prototype.constructor === Demo) // true
console.dir(Demo.prototype)
@前端进阶之旅: 代码已经复制到剪贴板

可以看到就是Demo函数对象的prototype原型是右边这个对象,那么Demo.prototype原型上有个constructor属性,这个属性正好指向Demo函数本身。
所有你可以理解成:
A的显示原型是B,则有:
A.prototype === B
B.constructor === A
@前端进阶之旅: 代码已经复制到剪贴板
我觉得这样子唯一的好处在于你可以找到我,我也可以找到你。好滑稽
# __proto__和prototype关系
再次强调 :
1️⃣__proto__和constructor是对象独有的。2️⃣prototype属性是函数独有的
关于更多__proto__更深入的介绍,可以参看工业聚大佬的《深入理解 JavaScript 原型》一文。
# 显示原型和隐式原型
- 每个函数fun都独有一个prototype, 及显式原型(属性)
- 每个实例对象都有一个
__proto__, 及隐式原型(属性)** - 对象的隐式原型的值 === 其构造函数的显示原型的值
怎么理解呢?我们通过内存结构图来看看吧
