什么是原型链
原型链是指一个对象A链接着另外一个对象B。A[[prototype]] = B
如何实现原型链
new
Java 中的constructor是个特殊的函数。但是在JS里,它没有什么特殊的,或者可以说它只是正好叫‘constructor’。它只是以new 方式来调用,也就是函数的构造器调用。函数本身都一样,调用方式不一样。
out of thin air: 稀薄空气一般是在高海拔地区,这些地方因为空气稀薄,一般都是人迹罕至的,大家都不会预想这里会有人出现,所以如果一旦有人出现,那就是突然出现, in a sudden or unexpected way。
new 操作的逻辑
var a = new Fn()
- 创建了一个新对象a
- a.[[prototype]] 指向函数Fn的prototype属性
- this 指向a
- 除非函数返回自己的替换对象(这个对象每次也会创建新的),否则的话,new调用生成的函数会自动返回新构建的对象
Object.create
Object.create 的逻辑
A = Object.create(B)
- A.[[prototype]] = B
- 新建一个object
已知new 可以实现的功能是
C = new D()
C.[[prototype]] = D.prototype
所以
Object.create = function(proto) {
function Fn() {}
Fn.prototype = proto
return new Fn()
}
prototype属性
xx.prototype 是个独立的对象。
A instanceof B逻辑
沿着A[[prototype]] 链查找B.prototype 如果有,那么返回true。
U don't know JS yet
上面这张图中标示除了Object 和 Function之间的关系。可以解释
Object instanceof Function // true
Function instanceof Object // true
先看第一个,沿着Object[[prototype]] 链查看,看有没有Function.prototype
。 有,所以返回true。
第二个, 沿着Function[[prototype]] 链查看,也有Object.prototype。 所以结果也是true。
image.png
⚠️constructor不代表什么。没有什么特别的操作。