当前位置: 首页 > news >正文

【JavaScript】手写 Object.prototype.toString()

🔧 ​​一、核心实现原理​

  1. ​内部逻辑​

    • 访问对象的 Symbol.toStringTag 属性(ES6+)或内部 [[Class]] 属性(ES5 及之前)。
    • 若属性不存在,根据对象类型推断默认标签(如 "Object""Array")。
    • 返回拼接字符串 "[object " + tag + "]"
  2. ​关键特性​

    • ​不可直接调用​​:需通过 call/apply 绑定 this 指向目标对象。
    • ​优先级​​:Symbol.toStringTag > 内置 [[Class]] 属性。

✨ ​​二、完整代码实现​

Object.defineProperty(Object.prototype, 'toString', {value: function() {// 1. 处理 null 和 undefinedif (this === null) return '[object Null]';if (this === undefined) return '[object Undefined]';// 2. 获取 Symbol.toStringTag 或内部 [[Class]]const tag = Symbol.toStringTag in Object(this) ? this[Symbol.toStringTag] : Object.prototype.toString.getInternalClass(this);// 3. 返回格式化字符串return `[object ${tag}]`;},writable: true,configurable: true
});// 辅助方法:模拟内部 [[Class]] 检测
Object.prototype.toString.getInternalClass = (obj) => {if (Array.isArray(obj)) return 'Array';if (obj instanceof Date) return 'Date';if (obj instanceof RegExp) return 'RegExp';// 其他内置类型判断...return 'Object'; // 默认值
};

🧪 ​​三、功能验证​

1. ​​基本类型检测​
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(new Date())); // [object Date]
console.log(Object.prototype.toString.call(null)); // [object Null]
2. ​​自定义类型标签​
class MyClass {get [Symbol.toStringTag]() { return 'MyClass'; }
}
console.log(Object.prototype.toString.call(new MyClass())); // [object MyClass]
3. ​​避免重写影响​
const arr = [];
arr.toString = () => "Overridden!";
console.log(Object.prototype.toString.call(arr)); // 仍输出 [object Array]

⚠️ ​​四、注意事项​

  1. ​兼容性处理​

    • 旧版浏览器(如 IE)需手动实现 Symbol.toStringTagPolyfill
    • 内部 [[Class]] 在 ES5 后不再直接暴露,需通过类型推断模拟。
  2. ​性能优化​

    • 避免频繁调用:每次调用涉及原型链查找和字符串拼接,对性能敏感场景慎用。
  3. ​与重写方法的区别​

    • 直接调用 obj.toString() 可能被重写逻辑覆盖,而 Object.prototype.toString.call(obj) 始终访问原始方法。

💡 ​​五、应用场景​

  1. ​精准类型判断​
    替代 typeofinstanceof,统一处理基本类型和对象类型:

    function getType(obj) {return Object.prototype.toString.call(obj).slice(8, -1);
    }
    getType(new Map()); // "Map"
    
  2. ​自定义对象描述​
    通过 Symbol.toStringTag 控制调试信息输出:

    class NetworkError {get [Symbol.toStringTag]() { return 'NetworkError'; }
    }
    console.log(new NetworkError() + ""); // [object NetworkError]
    

http://www.lryc.cn/news/603431.html

相关文章:

  • 利用对称算法及非对称算法实现安全启动
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 机器学习 线性回归算法及案例实现
  • Generative AI in Game Development
  • 信号上升沿时间与频谱分量的关系
  • 多线程--关于锁的一些知识考点
  • NumPy 2.x 完全指南【三十】整数数组索引
  • 5.1 动⼿实现⼀个 LLaMA2 ⼤模型
  • Effective C++ 条款10:令operator=返回一个reference to *this
  • 【Java面试题】面向对象
  • Kubernetes 高级调度 01
  • 实现多路标注截图
  • WMS仓储管理系统在不良品管理中的优化策略
  • OpenCL - study - code04 canny
  • C++基础:模拟实现priority_queue(堆),详细介绍仿函数
  • Python 程序设计讲义(29):字符串的处理方法——大小写转换
  • 网络数据传输与NAT技术的工作原理
  • 计算机网络五层模型
  • 【微信小程序】12、生物认证能力
  • .gitignore 添加 vue.config.js 时不好使
  • 微信小程序无法构建npm,可能是如下几个原因
  • Excel批量加密工具,一键保护多个文件
  • 聚观早报 | 三星获特斯拉AI芯片订单;小米16首发成安卓最强SOC;iPhone 17 Pro支持8倍光学变焦
  • 递归推理树(RR-Tree)系统:构建认知推理的骨架结构
  • [leetcode] 实现 Trie (前缀树)
  • 开发避坑短篇(8):Java Cookie值非法字符异常分析与解决方案:IllegalArgumentException[32]
  • 【C#获取高精度时间】
  • 智能落地扇方案:青稞RISC-V电机 MCU一览
  • SZU大学物理实验报告|电位差计
  • 【dropdown组件填坑指南】—怎么实现下拉框的位置计算