当前位置:首页 > JavaScript

js实现intanceof

2026-03-14 19:41:01JavaScript

实现 instanceof 的原理

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。手动实现时需要遍历对象的原型链,与构造函数的 prototype 进行比较。

js实现intanceof

基本实现代码

function myInstanceof(obj, constructor) {
    let proto = Object.getPrototypeOf(obj)
    const prototype = constructor.prototype

    while (proto !== null) {
        if (proto === prototype) {
            return true
        }
        proto = Object.getPrototypeOf(proto)
    }

    return false
}

边界情况处理

原始值类型直接返回 false:

js实现intanceof

function myInstanceof(obj, constructor) {
    if (obj === null || typeof obj !== 'object') {
        return false
    }

    let proto = Object.getPrototypeOf(obj)
    const prototype = constructor.prototype

    while (proto !== null) {
        if (proto === prototype) {
            return true
        }
        proto = Object.getPrototypeOf(proto)
    }

    return false
}

使用示例

function Person() {}
const p = new Person()

console.log(myInstanceof(p, Person)) // true
console.log(myInstanceof(p, Object)) // true
console.log(myInstanceof([], Array)) // true
console.log(myInstanceof(123, Number)) // false

与原生 instanceof 的区别

原生 instanceof 会检查 Symbol.hasInstance 方法,如果构造函数有这个静态方法,会调用它来判断。完整实现需要考虑这个特性:

function myInstanceof(obj, constructor) {
    if (typeof constructor !== 'function') {
        throw new TypeError('Right-hand side of instanceof is not callable')
    }

    if (typeof constructor[Symbol.hasInstance] === 'function') {
        return constructor[Symbol.hasInstance](obj)
    }

    if (obj === null || typeof obj !== 'object') {
        return false
    }

    let proto = Object.getPrototypeOf(obj)
    const prototype = constructor.prototype

    while (proto !== null) {
        if (proto === prototype) {
            return true
        }
        proto = Object.getPrototypeOf(proto)
    }

    return false
}

性能考虑

原型链可能很长,遍历会影响性能。实际应用中应避免过深的原型链设计。

标签: jsintanceof
分享给朋友:

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…