instanceof 原理
運行流程
function instance_of(L, R) { //L 表示左表達式,R 表示右表達式
var O = R.prototype; // 取 R 的顯式原型(后面的對象只取顯式原型prototype)
L = L.__proto__; // 取 L 的隱式原型(判斷的對象取__proto__,而且會一直向上判斷)
while (true) {
if (L === null)
return false;
if (O === L) // 這里重點:當 O 嚴格等于 L 時,返回 true
return true;
L = L.__proto__;
}
}
在 JavaScript 原型繼承結構里面,規范中用 [[Prototype]] 表示對象隱式的原型,在 JavaScript 中用 __proto__ 表示,并且在 Firefox 和 Chrome 瀏覽器中是可以訪問得到這個屬性的,但是 IE11 以下不行。所有 JavaScript 對象都有 __proto__ 屬性,但只有 Object.prototype.__proto__ 為 null,前提是沒有在 Firefox 或者 Chrome 下修改過這個屬性。這個屬性指向它的原型對象。 至于顯式的原型,在 JavaScript 里用 prototype 屬性表示
判斷舉例
Object instanceof Object
// 為了方便表述,首先區分左側表達式和右側表達式
ObjectL = Object, ObjectR = Object;
// 下面根據規范逐步推演
O = ObjectR.prototype = Object.prototype
L = ObjectL.__proto__ = Function.prototype
// 第一次判斷
O != L
// 循環查找 L 是否還有 __proto__
L = Function.prototype.__proto__ = Object.prototype
// 第二次判斷
O == L
// 返回 true
Function instanceof Function
// 為了方便表述,首先區分左側表達式和右側表達式
FunctionL = Function, FunctionR = Function;
// 下面根據規范逐步推演
O = FunctionR.prototype = Function.prototype
L = FunctionL.__proto__ = Function.prototype
// 第一次判斷
O == L
// 返回 true
Foo instanceof Foo
// 為了方便表述,首先區分左側表達式和右側表達式
FooL = Foo, FooR = Foo;
// 下面根據規范逐步推演
O = FooR.prototype = Foo.prototype
L = FooL.__proto__ = Function.prototype
// 第一次判斷
O != L
// 循環再次查找 L 是否還有 __proto__
L = Function.prototype.__proto__ = Object.prototype
// 第二次判斷
O != L
// 再次循環查找 L 是否還有 __proto__
L = Object.prototype.__proto__ = null
// 第三次判斷
L == null
// 返回 false
總結
以上是生活随笔為你收集整理的instanceof 原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 薛宝钗的性格特点
- 下一篇: Replace和ReplaceAll的差