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

Object.create(null)`和`{}`创建的对象有什么区别?

在 JavaScript 中,使用 Object.create(null){} 创建的对象有以下核心区别:


1. 原型链的差异

创建方式原型链([[Prototype]]继承关系
const obj = {}继承自 Object.prototype拥有 Object 的原型方法
const obj = Object.create(null)原型链为 null无任何继承
示例代码
const objLiteral = {}; 
const objNullProto = Object.create(null);console.log(objLiteral.toString); // ƒ toString() { [native code] }
console.log(objNullProto.toString); // undefined(无原型链)

2. 内置方法的存在性

  • {} 创建的对象
    继承 Object.prototype 的方法,如 toStringhasOwnPropertyvalueOf 等。

    const obj = {};
    console.log("toString" in obj); // true(来自原型链)
    
  • Object.create(null) 创建的对象
    完全纯净,不包含任何继承方法。

    const obj = Object.create(null);
    console.log("toString" in obj); // false
    

3. 适用场景

使用 {} 的场景
  • 需要利用 Object 的原型方法(如 obj.hasOwnProperty())。
  • 需要与其他代码或库交互,依赖对象的标准行为。
  • 快速创建普通对象,无需特殊处理原型链。
使用 Object.create(null) 的场景
  • 作为纯字典(键值对)
    避免原型链属性污染(如 toStringconstructor 等可能被误覆盖)。

    const dict = Object.create(null);
    dict.key = "value";
    console.log("toString" in dict); // false(不会被意外覆盖)
    
  • 性能优化
    无原型链的对象在某些引擎中访问速度更快(极少情况需实测验证)。

  • 特殊用途
    实现更安全的属性存储(如 JSON.stringify(obj) 时不会包含原型链上的属性)。


4. 其他差异

特性{}Object.create(null)
instanceof Objecttruefalse(无 Object 原型链)
属性枚举可能包含原型链属性(需用 hasOwnProperty 过滤)仅自身属性
内存占用稍高(包含原型链引用)更低(无原型链)

示例对比

// 使用 {} 创建的对象
const obj1 = {};
console.log(obj1.constructor); // ƒ Object() { [native code] }(来自原型链)// 使用 Object.create(null) 创建的对象
const obj2 = Object.create(null);
console.log(obj2.constructor); // undefined// 安全存储键值对
const safeDict = Object.create(null);
safeDict.toString = "自定义值"; // 无需担心覆盖原型方法
console.log(safeDict.toString); // "自定义值"(而非方法)

总结

  • {}
    适合大多数场景,拥有标准对象的行为和原型方法,方便与其他代码交互。

  • Object.create(null)
    适合需要完全纯净、无原型干扰的场景(如字典、低耦合数据存储),但需手动实现原型方法(如 hasOwnProperty 的替代方案)。

相关文章:

  • git提交规范
  • Linux的应用领域,测试与Linux,Linux的介绍,VirtualBox和Ubuntu的安装,VMware的安装和打开虚拟机CentOS
  • 密码学(二)流密码
  • Delphi HMAC算法
  • Spring常用注解
  • 大模型在轮状病毒肠炎预测及临床方案制定中的应用研究
  • 工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台
  • AF3 create_alignment_db_sharded脚本create_shard函数解读
  • mysql删除表后重建表报错Tablespace exists
  • Grafana安装
  • 云服务器X86计算和Arm计算架构有什么区别?
  • 莒县第六实验小学:举行“阅读世界 丰盈自我”淘书会
  • Xilinx 7系列fpga在线升级和跳转
  • AF3 create_alignment_db_sharded脚本process_chunk函数解读
  • 视频设备轨迹回放平台EasyCVR利旧前端设备,打造智慧校园视频上云方案
  • Apifox 全面支持 LLMs.txt:让 AI 更好地理解你的 API 文档
  • python的import类与模块区别
  • windows上rabbitmq服务激活后 15672无法打开
  • 灰度共生矩阵(GLCM)简介
  • ROS2模块库概览
  • 规划和设计一个网站/单页面网站如何优化
  • 怎么给网站做seo/源码交易平台
  • 衢州网站建设衢州/郑州做网站哪家好
  • phpcms网站打不开/百度官方客服电话
  • 长链接转短链接/网站很卡如何优化
  • oss做静态网站/企业网络推广的方法