instanceOf 的判断是基于原型链,即比对右侧表达式是否在左侧表达式的原型链上。

1
2
3
4
5
6
7
8
9
10
11
12
13
// instanceof
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
`
1
2
3
4
// some e.g
Object.prototype.__proto__ -> null
Function.prototype.__proto__ -> Object.prototype
function Object(){} function Function(){} __proto__ 都指向Function.prototype