instanceOf 运算符原理

news/2024/7/19 14:01:46 标签: js, object, javascript, 原型链

定义

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。 —— MDN

简单理解为:instanceof可以检测一个实例是否属于某种类型。

javascript">function Foo(){}
const a = new Foo()

a instanceof Foo       // true
a instanceof Object    // true

还可以在继承关系中用来判断一个实例是否属于它的父类型。

javascript">function Foo(){}
function Child(){}
function Other(){}
Child.prototype = new Foo     // 继承原型

const b = new Child()
b instanceof Foo       // true
b instanceof Child     // true
b instanceof Other     // false
b instanceof Object    // true

实现

查看对象B的prototype指向的对象是否在对象A的[[prototype]]链上。

如果在,则返回true,如果不在则返回false。不过有一个特殊的情况,当对象B的prototypenull将会报错(类似于空指针异常)。

函数模拟 A instanceof B:

javascript">/**
* @param obj{Object} 测试对象
* @param fun{Function} 构造函数
*/
function instanceOf(A, B) {
    let obj = A.__proto__
    let fn = B.prototype
    while (true) {
        if (obj === null) return false
        // 这里重点:当 fn 严格等于 obj 时,则返回 true
        if (fn === obj) return true
        obj = obj.__proto__
    }
}

http://www.niftyadmin.cn/n/658229.html

相关文章

ElasticSearch文档及分布式文档存储

1、什么是文档? 文档由索引(_index),类型(_type),唯一标识(_id) 组成,我们为 _index(索引) 分配相关逻辑地址分片,该索引下的数据会根据索引以及类型计算哈希来分配数据存储的分片,文…

update from 语句的写法

UPDATE EPD_ITEM_MASTER rrSET plan_price (SELECT top 1 plan_price FROM newdata WHERE item_code rr.item_code)WHERE item_code IN (SELECT item_code from uuu) 我有三个表 epd_item_master,newdata,uuu我是想用newdata中的plan_price 代替 epd_item_master中的 plan_pr…

[C++_QT] Error: Not a signal or slot declaration

问题: 在Qt工程中添加了一个新的窗口之后 一直报错 如下 单单从错误描述上看 是缺少信号或者槽 但是我确定没有缺少啊 然后第二个错误显示了一个mox_xxxx文件 然后我就去那个目录下去找那个文件 但是发现没有 所以接下来就是找到为什么没有moc_xxx文件 moc文件的生成和 有关系 …

浏览器输入URL后都发生了什么??

DNS 域名解析 在网络世界,你肯定记得住网站的名称,但是很难记住网站的 IP 地址,因而也需要一个地址簿,就是 DNS 服务器。DNS 服务器是高可用、高并发和分布式的,它是树状结构,如图: 根 DNS 服…

Vue3开发踩坑

期待了很久的vue3,一发布就上手体验了一把,这里记录几个自己碰到的网上不常见的小坑~ 自定义全局参数 定义: // main.js const app createApp(App)app.config.globalProperties.$test test除了setup()需要先获得实例,其他地方…

Leetcode 1013. Partition Array Into Three Parts With Equal Sum

简单题,暴力找出来就行. class Solution:def canThreePartsEqualSum(self, A: List[int]) -> bool:s sum(A)if s % 3 > 0:return Falses / 3size len(A)t 0a, b -1, -1for i in range(size):t A[i]if t s:a ibreakt 0for j in range(size - 1, -1, -1):t A[j]if…

javascript代码重构之:写好函数

1、函数要短小,一个函数只做一件事 如果函数做了较多的事情,它就难以组合、测试和推测。同时让函数只做一件事情的时候,它们就很容易重构。 // Bad functionshowStudent(ssn){ conststudent db. get (ssn); if (student ! null ){documen…

ORACLE UPDATE 语句语法与性能分析看法 [转]

update 作者:未知   ORACLE UPDATE 语句语法与性能分析的一点看法 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 cit…