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

时间: 2024-10-25 01:43:55

instanceof 原理的相关文章

夯实基础之--new关键字、instanceOf原理

1.instanceOf原理  检测右边构造函数的prototype是否在左边对象的原型链上,在返回true,不在返回false 例:function  Persion(name,age){ this.name = name; this.age  = age; } ; let  p  = new  Persion() console.log( p   instanceOf  Persion )      //true 对象p的原型链为:p.__proto__  ==   Persion.prot

javascript中原型链与instanceof 原理

instanceof:用来判断实例是否是属于某个对象,这个判断依据是什么呢? 首先,了解一下javascript中的原型继承的基础知识: javascript中的对象都有一个__proto__属性,这个是对象的隐式原型,指向该对象的原型对象.显式的原型对象使用prototype,但是Object.prototype.__proto__=null; 判断某个对象a是否属于某个类A的实例,可以通过搜索原型链. //继承机制 function A(){ } A.prototype.name='licu

理解Javascript_07_理解instanceof实现原理 【转】

在<Javascript类型检测>一文中讲到了用instanceof来用做检测类型,让我们来回顾一下: 那么instanceof的这种行为到底是如何实现的呢,现在让我们揭开instanceof背后的迷雾. instanceof原理 照惯例,我们先来看一段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 function Cat(){} Cat.prototype = {} function Dog(){}

详解 JS 中 new 调用函数原理

JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数),那在使用 new 调用一个函数的时候到底发生了什么?先看几个例子,再解释背后发生了什么. 1)看三个例子 1.1 无 return 语句 构造函数最后没有 return 语句,这也是使用构造函数时默认情况,最后会返回一个新对象,如下: function Foo(age) { this.age = age; } var o = new Foo(111); console.log(o); 这是常见的使用构造函数创建

理解Javascript_09_Function与Object 【转】

在<理解Javascript_08_函数对象>中讲解了很多函数对象的问题,同时也留下了许多疑问,今天让我们来解答部分问题. 注:理论过于深入,本人不改保证所有的理论都是正确的,但经过多方测试还未发现实际代码与理论冲突的问题.如有错误,望高人指点! Function 首先回顾一下函数对象的概念,函数就是对象,代表函数的对象就是函数对象.所有的函数对象是被Function这个函数对象构造出来的.也就是说,Function是最顶层的构造器.它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,

JavaScript 常见大坑与细节

执行环境(Execution context) var 和 let 的正确解释 当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境. 接下来让我们看一个老生常谈的例子,var b() // call b console.log(a) // undefined var a = 'Hello world' function b() { console.log('call b') } 想必以上的输出大家肯定都已经明白了

中高级前端大厂面试秘籍,为你保驾护航金三银四,直通大厂(上)

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~??.缩减HC.裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀.但博主始终相信,寒冬之中,人才更是尤为珍贵.只要有过硬的操作和装备,在逆风局下,同样也能来一波收割翻盘. 博主也是年前经历了一番厮杀,最终拿到多家大厂的 offer.在闭关修炼的过程中,自己整理出了一套面试秘籍供自己反复研究,后来给了多位有需要的兄台,均表示相当靠谱,理应在这寒冬之中回报于社会.于是决定花点精力整理成

面试视频知识点整理1-8(原型链)

创建对象的有几种方法?     1)字面量     2)构造函数     3)Object.create 原型链中(原型,构造函数,实例,原型链之间的关系) instanceof原理: 判断的是实例的__proto__属性和构造函数的prototype指向的是否是一个对象地址(注意:如果是统一个对象地址,那么原型链往上的也会返回为true)如果是想要确定实例是否是哪个构造函数的实例,用constructor会比较严谨 new运算符: 1)创建了一个新的对象 2)将this指向这个新对象 3)执行

【JS】类型检测

本文首发于我的个人博客 : http://cherryblog.site/ 前言 js 中的类型检测也是很重要的一部分,所以说这篇文章我们就来讲一下怎么对 JavaScript 中的基本数据类型进行检测.其实这也是在读 Zepto 源码中学习到的,所以阅读源码对我们的提升还是很有帮助的.本文基于参考了前辈们的文章之后个人理解此文写的有不当的地方,请各位大佬指正. 其实常规方法主要有四种 typeof instanceof Object.prototype.toString construcor