Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

    • 编程语言

      • CSS

      • HTML

      • JavaScript

        • ECMAScript6入门
        • JS 手写题

          • 实现 call, apply, bind
          • 实现 debounce 和 throttle
          • 实现 instanceOf
            • 背景
            • 实现
          • 实现 new 操作符
        • JS技巧
        • JS 学习笔记
        • Promise then 原理分析
        • async 函数编译原理
        • 你不知道的JavaScript(上)
        • 再谈闭包
        • 浏览器剪切板协议
        • 前端实现相对路径转绝对路径的几种方法
        • 为什么 0.._ 等于 undefined
        • 前端项目中常用的位操作技巧
        • 如何利用前端剪切板实现文件上传
        • 快速理解 JS 装饰器
        • 趣味js-只用特殊字符生成任意字符串
        • 重学 JS 原型链
        • 面试官问:怎么避免函数调用栈溢出
      • Rust

      • TypeScript

      • WebAssembly

    • 开发工具

    • 前端调试

    • 浏览器原理

    • 浏览器生态

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 前端基础
  • 编程语言
  • JavaScript
  • JS 手写题
gahing
2019-12-31
目录

实现 instanceOf专题

# 背景

object instanceof constructor
1

instanceof 运算符用于检测构造函数 constructor 的 prototype 属性是否出现在某个实例对象 object 的原型链上。

不用 instanceof 操作符,模拟实现一个 myInstanceof (object,constructor) 方法,得到相同的效果

# 实现

这里就不做类型检测了

核心就是查找 object 的原型链,不断的与 constructor 的原型比对,如果一致则返回 true

function myInstanceof (object, constructor){
  const targetPrototype = constructor.prototype
  while(object){
    object = Object.getPrototypeOf(object); // 相当于 object.__proto__
    if(targetPrototype === object){
      return true
    }
  }
  return false
}
1
2
3
4
5
6
7
8
9
10

注意以下这些情况

"test" instanceof String // false
Number instanceof Object // true
1
2

Object.getPrototypeOf('test') === String.prototype

但其实是因为对 'test' 执行了 ToObject 生成了一个临时包装对象 new String("test"),导致判断错误

所以当 object 不是纯对象(非 null 对象和方法)时,直接返回 false

而 Number 不止是一个方法,其实是一个 Function 构造函数的实例对象,故

Number.__proto__ === Function.prototype // true
// Function.prototype 输出 ƒ () { [native code] } ,且不会被重写
Object.getOwnPropertyDescriptor(Function,'prototype') // {value: ƒ, writable: false, enumerable: false, configurable: false}
Function.prototype.__proto__ === Object.prototype // true
// so
Number instanceof Object // true
1
2
3
4
5
6
function myInstanceof (object, constructor){
  const isESObject = (typeof object === 'object' && object !== null) || typeof object === 'function'
  if(!isESObject){
    return false
  }
  const targetPrototype = constructor.prototype
  while(object){
    object = Object.getPrototypeOf(object); // 相当于 object.__proto__
    if(targetPrototype === object){
      return true
    }
  }
  return false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

测试用例

console.log(myInstanceof({},Object)) // true
console.log(myInstanceof("test",String)) // false
console.log(myInstanceof(Number,Object)) // true
1
2
3
编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56
实现 debounce 和 throttle
实现 new 操作符

← 实现 debounce 和 throttle 实现 new 操作符→

最近更新
01
浅谈代码质量与量化指标
08-27
02
快速理解 JS 装饰器
08-26
03
Vue 项目中的 data-v-xxx 是怎么生成的
09-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式