当前位置:首页 > JavaScript

js实现myinstanceof

2026-01-31 23:03:40JavaScript

实现 myInstanceOf 方法

在 JavaScript 中,instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。以下是手动实现 myInstanceOf 的方法:

js实现myinstanceof

function myInstanceOf(obj, constructor) {
    if (typeof constructor !== 'function') {
        throw new TypeError('Right-hand side of instanceof is not callable');
    }
    if (obj === null || typeof obj !== 'object') {
        return false;
    }

    let proto = Object.getPrototypeOf(obj);
    while (proto !== null) {
        if (proto === constructor.prototype) {
            return true;
        }
        proto = Object.getPrototypeOf(proto);
    }
    return false;
}

代码解析

  • 检查 constructor 是否为函数,如果不是则抛出类型错误。
  • 检查 obj 是否为对象或不为 null,如果不是则直接返回 false
  • 获取 obj 的原型对象,并沿着原型链向上查找。
  • 如果找到与 constructor.prototype 相等的原型对象,则返回 true
  • 如果遍历完整个原型链仍未找到匹配的原型对象,则返回 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([], Object)); // true
console.log(myInstanceOf(123, Number)); // false

注意事项

  • 该方法模拟了原生 instanceof 的行为,但原生 instanceof 对基本类型(如 NumberString)的处理略有不同。
  • 如果传入的 obj 是基本类型(非对象),直接返回 false,与原生 instanceof 行为一致。

标签: jsmyinstanceof
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…