首页 > 其他分享 >js怎样避免原型链上的对象共享?

js怎样避免原型链上的对象共享?

时间:2024-12-07 09:33:05浏览次数:3  
标签:const log 对象 js 链上 原型 console copy original

在 JavaScript 中,原型链上的对象共享是继承机制的副作用。虽然它带来了代码复用和内存效率的好处,但也可能导致意外的修改影响到所有继承该原型的对象。为了避免这种情况,你需要打破原型链,创建对象的副本而不是直接引用原型上的属性。以下是一些常见的方法:

1. 使用 Object.create(null) 创建一个没有原型的对象:

这是创建真正干净的对象的最佳方法,因为它完全绕过了原型链。这意味着你的对象不会继承任何属性或方法,包括 Object.prototype 上的常用方法,例如 toString()hasOwnProperty()。你需要手动添加所有需要的功能。

const myObject = Object.create(null);
myObject.name = "My Object";

console.log(myObject.toString()); // TypeError: myObject.toString is not a function

2. 使用浅拷贝:

浅拷贝会创建新对象,并将原始对象的属性值复制到新对象中。如果属性值是基本类型(例如数字、字符串、布尔值),则会复制值本身。如果是引用类型(例如对象、数组),则只会复制引用,而不是复制对象本身。这意味着修改新对象中的引用类型属性仍然会影响原始对象以及其他共享该引用的对象。

  • Object.assign():
const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);

copy.a = 3; // 修改copy不会影响original
copy.b.c = 4; // 修改copy.b.c会影响original.b.c

console.log(original); // { a: 1, b: { c: 4 } }
console.log(copy);     // { a: 3, b: { c: 4 } }
  • 展开运算符(Spread syntax):
const original = { a: 1, b: { c: 2 } };
const copy = { ...original };

copy.a = 3; // 修改copy不会影响original
copy.b.c = 4; // 修改copy.b.c会影响original.b.c

console.log(original); // { a: 1, b: { c: 4 } }
console.log(copy);     // { a: 3, b: { c: 4 } }

3. 使用深拷贝:

深拷贝会创建新对象,并递归地复制所有嵌套的属性值,包括引用类型。这意味着修改新对象不会影响原始对象,反之亦然。

  • JSON.parse(JSON.stringify(object)): 这是一个简单的深拷贝方法,但它有一些局限性,例如无法处理函数、循环引用和某些特殊对象(例如 DateRegExp)。
const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));

copy.b.c = 4; // 修改copy不会影响original

console.log(original); // { a: 1, b: { c: 2 } }
console.log(copy);     // { a: 1, b: { c: 4 } }
  • Lodash 的 _.cloneDeep(): Lodash 库提供了一个更强大的 _.cloneDeep() 方法,可以处理各种数据类型和复杂的嵌套结构。
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
const copy = _.cloneDeep(original);

copy.b.c = 4; // 修改copy不会影响original

console.log(original); // { a: 1, b: { c: 2 } }
console.log(copy);     // { a: 1, b: { c: 4 } }

选择哪种方法取决于你的具体需求。如果需要完全隔离的对象,Object.create(null) 是最佳选择。如果只需要浅拷贝并且可以接受共享引用类型的风险,可以使用 Object.assign() 或展开运算符。如果需要完全复制所有嵌套属性,则需要使用深拷贝方法,例如 JSON.parse(JSON.stringify(object)) 或 Lodash 的 _.cloneDeep()

希望这些信息能帮助你!

标签:const,log,对象,js,链上,原型,console,copy,original
From: https://www.cnblogs.com/ai888/p/18591764

相关文章

  • 说说你对JSBridge的理解
    JSBridge,顾名思义,就是JavaScript和Native(原生应用,例如Android的Java和iOS的Objective-C/Swift)之间的桥梁。它允许JavaScript代码和Native代码互相调用,从而扩展了JavaScript的能力,使得Web应用可以访问设备的原生功能。以下是JSBridge的一些关键理解:作......
  • js循环中调用异步的方法,如何确保执行结果的顺序是正确的?
    在JavaScript循环中调用异步方法,如果想要确保执行结果的顺序和循环的顺序一致,有几种常见的方法:1.使用async/await和for...of循环:这是最推荐和最清晰的方法。for...of循环会等待每次异步操作完成之后再进行下一次迭代。asyncfunctionprocessData(data){constres......
  • 基于Java+SSM+JSP学生作业管理系统(源码+LW+调试文档+讲解等)/学生作业管理系统/作业
    博主介绍......
  • 深入浅出ArkTS开发指南之调用接口将 json 对象渲染到界面
    大家好,我是全栈的峰哥,独立开发者,相关问题可以加v:2588234,联系我一起沟通今天主要给大家带来通过调用接口,通过返回参数转换成我们需要的对象,并通过状态管理,渲染到界面上,主要案例是在首页需要调用轮播图接口list,并在首页上能展示轮播图定义实体首选,我们需要先定义接口返回的json......
  • node.js毕设网上求职招聘系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于网上求职招聘系统的研究,现有研究主要以线下招聘流程的数字化转换为主,专门针对网上求职招聘系统全面功能优化、用户体验提升以及数据安全性保障等方......
  • node.js毕设网上人才招聘系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于人才招聘系统的研究,现有研究主要以传统招聘模式或线下招聘流程为主,专门针对网上人才招聘系统的全面研究较少。在国内外,传统招聘方式一直占据着重要......
  • Python模块之random、hashlib、json、time等内置模块语法学习
    Python内置模块语法学习random、hashlib、json、time、datetime、os等内置模块语法学习模块简单理解为就是一个.py后缀的一个文件分为三种:内置模块:python自带,可调用第三方模块:别人设计的,可调用自定义模块:自己编写的,可调用模块之间苦于相互调用,是Python最高级别的组织......
  • JavaSwing JSlider
    try{BeautyEyeLNFHelper.frameBorderStyle=BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;//UIManager.put("RootPane.setupButtonVisible",false);org.jb2011.lnf.beautyeye.BeautyEyeLNFHelpe......
  • PDF.js 渲染存档 + 疑难杂症
    当前使用部分如下前端部分<template><divclass="container"style="margin:0;padding:0;"><divid="pdf-view"class="pdf-view"><!--渲染PDF--><divv-for="pageinstate.pdfPages&......
  • json学习
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它通常用于在服务器和客户端之间交换数据,特别是在Web应用中。JSON格式基于JavaScript对象表示法,但它是语言独立的,广泛用于多种编程语言中。JSON使用文本格式来存储和表......