当前位置:首页 > JavaScript

js实现intanceof

2026-03-14 19:41:01JavaScript

实现 instanceof 的原理

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

基本实现代码

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:

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 方法,如果构造函数有这个静态方法,会调用它来判断。完整实现需要考虑这个特性:

js实现intanceof

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实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现防洪

js实现防洪

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

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…