【JS】Object的静态方法

前言

像map、filter、some等方法都是Object实例的方法,即原型链方法。
Object的静态方法不依赖于任何对象实例,而是直接调用Object类本身。

常用静态方法如下:

一、Object.assign(target,…source)

将一个或多个源对象的属性复制到目标对象,并返回目标对象
如果有相同属性,会根据参数顺序依次覆盖对应的值。

const target = { a: 1, b: 2 };
const source1 = { b: 3, c: 4 };
const source2 = { b: 5, c: 6, d: 7 };
const merged = Object.assign(target, source1, source2);console.log(merged); // {a: 1, b: 5, c: 6, d: 7}

真实场景

vue3的reactive数据替换整个对象,注意:ref数据不需要,Obj.value = newObj 即可。

二、Object.keys(obj)

返回一个数组,其中包含对象的所有可枚举属性的名称。

const obj = { a: 1, b: 2, c: 3 };
const keys = Object.keys(obj);console.log(keys); // ["a", "b", "c"]

三、Object.getOwnPropertyNames(obj)

返回一个数组,包含对象自身的所有符号属性。

const obj = { a: 1, b: 2, c: 3 };
console.log(Object.getOwnPropertyNames(obj)); // ["a", "b", "c"]

二三对比

上面两种方法均可获取对象的所有属性,但是有什么区别呢

返回结果

Object.getOwnPropertyNames(obj): 返回一个包含对象自身的所有属性名称「包括不可枚举属性」的数组。
Object.keys(obj): 返回一个包含对象自身的「所有可枚举属性」的数组。

const obj = {a: 1,b: 2,
};// 添加一个不可枚举属性 c
Object.defineProperty(obj, 'c', {value: 3,enumerable: false,
});console.log(Object.getOwnPropertyNames(obj)); // ["a", "b", "c"]
console.log(Object.keys(obj)); // ["a", "b"]

包含属性的顺序

Object.getOwnPropertyNames(obj) 返回的属性名称数组中的元素顺序是从对象属性添加的顺序到被删除的顺序。
Object.keys(obj) 返回的属性名称数组中的元素顺序可能与属性添加到对象中的顺序不同,因为它只返回对象的可枚举属性名称。

四、Object.values(obj)

返回一个数组,其中包含对象的所有可枚举属性的值。

const obj = { a: 1, b: 2, c: 3 };
const values = Object.values(obj);console.log(values); // [1, 2, 3]

五、Object.defineProperty(obj, prop, descriptor)

在对象上定义一个新属性或修改现有属性的特性。

Object.defineProperty(obj, 'prop', {value: 'value',writable: true,enumerable: true,configurable: true
});

Vue2中对其的应用

Vue2 通过Object.defineProperty来劫持对象的属性,使得当属性被访问或者修改时,可以执行相应的操作,比如更新视图。Vue3中ref的基本类型数据也采用的Object.defineProperty,但是ref的复杂数据类型的底层实现与reactive一致。

数据响应式

Vue.js利用Object.defineProperty在对象上定义属性的getter和setter来实现数据的响应式。当数据发生变化时,能够自动更新相关的视图。

let data = { value: '张三' };Object.defineProperty(data, 'value', {get() {console.log('Get');return this._value;},set(newValue) {console.log('Set');this._value = newValue;}
});console.log(data.value); // 张三
data.value = '李四'; // 触发set('李四')
console.log(data.value); // 李四

访问控制

通过Object.defineProperty可以限制属性的访问权限,比如设置属性为「只读」或者「不可枚举」。

let obj = {};Object.defineProperty(obj, 'readOnly', {value: '张三',writable: false, // 设置为只读enumerable: true // 可枚举
});console.log(obj.readOnly); // 张三
obj.readOnly = '李四'; // 不会改变值,不会报错,但是无效

属性扩展

可以利用Object.defineProperty来添加一些特殊的属性,比如计算属性。

let obj = { firstName: '张', lastName: '三' };Object.defineProperty(obj, 'fullName', {get() {return this.firstName + ' ' + this.lastName;},set(value) {const parts = value.split(' ');this.firstName = parts[0];this.lastName = parts[1];}
});console.log(obj.fullName); // 张 三
obj.fullName = '李 四';
console.log(obj.firstName); // 李
console.log(obj.lastName); // 四

六、Object.defineProperties(obj, props)

在对象上定义一个或多个新属性或修改现有属性的特性。

Object.defineProperties(obj, {prop1: { value: 'value1', writable: true },prop2: { value: 'value2', writable: true }
});

七、Object.entries(obj)

返回一个包含对象的所有可枚举属性的键值对数组。

const obj = { a: 1, b: 2, c: 3 };
const entries = Object.entries(obj);console.log(entries); // [["a", 1], ["b", 2], ["c", 3]]

八、Object.fromEntries(iterable)

将一个键值对的列表转换为一个对象。

const entries = [['a', 1], ['b', 2]];
console.log(Object.fromEntries(entries)); // { a: 1, b: 2 }

九、Object.freeze(obj)

冻结一个对象,防止对其进行修改,不可修改值或添加新属性。
即使修改不报错,但也未生效。

const obj = { a: 1, b: 2 };
Object.freeze(obj);
obj.a = 10; // 不会生效
obj.c = 10; // 不会生效
console.log(obj); // { a: 1, b: 2 }

十、Object.isFrozen(obj)

返回一个布尔值,判断一个对象是否被冻结。

const obj = { a: 1 };
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true

十一、Object.seal(obj)

封闭一个对象,防止添加新属性和删除现有属性,但允许修改现有属性的值。

const obj = { a: 1, b: 2 };
Object.seal(obj);
obj.a = 10; // 可以修改
obj.c = 3; // 不会生效
console.log(obj); // { a: 10, b: 2 }

十二、Object.isSealed(obj)

返回一个布尔值,判断一个对象是否被封闭。

const obj = { a: 1 };
Object.seal(obj);
console.log(Object.isSealed(obj)); // true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库(mysql)-新手笔记(主外键,视图)

主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段,其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的,不能有两个或更多的记录具有相同的主键值 非空性:主键字段不能包含NULL值。 外键(引用完整 …

AutoPSA里给定了弹簧刚度,为什么计算没有引用?

山东一用户问:已经给定了弹簧刚度,为什么计算没引用? 在AutoPSA里包含两种算法仿CAESARII ,仿GLIF算法。 在仿CAESARII算法里直接给定弹簧刚度与安载荷载,两个都给了相应值,也就是给定了弹簧号&#xff1b…

CF476D Dreamoon and Sets 题解 贪心

Dreamoon and Sets 传送门 Dreamoon likes to play with sets, integers and gcd ⁡ \gcd gcd . gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) is defined as the largest positive integer that divides both a a a and b b b . Let S S S be a set of exactly four distinct…

网络编程套接字(2)——Socket套接字

目录 一、概念 二、分类 1、流套接字(使用传输层TCP协议) TCP的特点 2、数据报套接字(使用传输层UDP协议) UDP的特点 3、原始套接字 一、概念 Socket套接字,是由系统提供用于网络通信的技术,是基于T…

ORACLE RAC ADG容灾实施

--1、主库检查 检查修改主库的force logging 模式 sqlplus / as sysdba SQL>select FORCE_LOGGING from v$database; alter database force logging; --主库remote_login_passwordfile 为EXCLUSIVE show parameter remote_login_passwordfile ---2、主库参数 alter …

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.: 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin (HTTPS) 比如这样: 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

Python实习生(自动化测试脚本开发) - 面经 - TCL新技术有限公司

JD: 招聘流程: 2024.1.3 Boss直聘 沟通 2024.1.4 约面 2024.1.6 上午面试 面试流程: 上来第一步,直接问Python基础语法,讲一下基础的数据类型 就记得元组和字典 分别具体说一下元组和字典 流程控制语句有哪些&…

应急布控球远程视频监控方案:视频监控平台EasyCVR+4G/5G应急布控球

随着科技的不断发展,应急布控球远程视频监控方案在公共安全、交通管理、城市管理等领域的应用越来越广泛。这种方案通过在现场部署应急布控球,实现对特定区域的实时监控,有助于及时发现问题、快速响应,提高管理效率。 智慧安防视…

SPFA找负环

2024-01-31(最短路径)-CSDN博客 求负环的常用方法,基于spfa: 1.统计每个点入队的次数,如果有个点入队n次,则说明存在负环 2.统计当前每个点的最短路中包含的边数,如果某个点的最短路的所包含的边…

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中,每次代码修改后,都会启动到首页,有时非常不方便,为了更高效的开发,有时需要模拟直接跳转到指定的页面, 操作方法如下: 在pages.joson里面配置下列代码: "…

Mybatis-Spring | Mybatis与Spring的“整合“

目录 : 一、配置环境1. 整合环境需导入的JAR :Spring框架所需JARMybatis框架所需JARMyBatis与Spring整合的中间JAR数据库驱动JAR包数据源所需JAR包 (下面的例子中 : 用的不是这个数据源) 2. 编写“配置文件” 和 “.properties文件” ( 只是概述&#xf…

Claude3真的超越GPT4了吗?

一文探究Claude3真实能力 Claude3就在昨天悄无声息的上线了,OpenAI的好兄弟Anthropic公司仅仅在推特上发了一条消息来宣布这件事情。 Anthropic这次一下就发了三个模型:Opus、Sonnet、Haiku。说实话这名字感觉取得不咋地,主要是看不懂&#x…

图机器学习(3)-面向节点的人工特征工程

0 问题引入 地铁导航图 计算机是看不懂这些图,计算机只能看懂向量、矩阵。 传统图机器学习只讨论连接特征。 构造一个新的特征 x 1 x 2 x_1x_2 x1​x2​,有利于分开这种数据。 人需要去翻译这些计算机不懂的特征,变成计算机可以懂…

python篇---pycharm运行正常,但命令行执行提示module不存在的多种解决方式

pycharm运行正常,但命令行执行提示module不存在的多种解决方式(全) 解决方法 向执行代码中添加根目录路径,一般添加在头部 方法一:写死绝对路径 import sys sys.path.append(xxx/xxx/xxx/)方法二:使用o…

使用CompositionLocal简化组合式函数参数

使用CompositionLocal简化组合式函数参数 目录 1. 组合式函数难以维护状态2. 通过CompositionLocal对象隐式传递状态3. 重组4. 示例5. 参考资料 1. 组合式函数难以维护状态 和对象相比,组合式函数维护状态的能力比较弱。如果所有状态都通过参数列表显示传递&…

javaSE-----继承和多态

目录 一.初识继承: 1.1什么是继承,为什么需要继承: 1.2继承的概念与语法: 二.成员的访问: 2.1super关键字 2.2this和super的区别: 三.再谈初始化: 小结: 四.初识多态: 4.1多…

CAS 登出方案

1.配置 CAS 服务器端 添加配置cas.logout.followServiceRedirects:true,使支持 CAS 退出时支持输入 service 参数为跳转路径 2.配置客户端服务,添加session清除操作 3.前端文件添加跳转重定向 1) 直接在客户端调用http请求/cas/logout去注销不能携带cookie信息, 无…

生信技能42 - Linux服务器CPU、内存、负载及高消耗进程监控信息写入本地日志

Linux服务器CPU、内存、负载及高消耗进程监控信息写入本地日志 可通过设置最大检测时间(小时)max_hour和循环检测休眠时间(秒)sleep_second调整监控程序的运行时间。 # Filename: monitor_server.py # -*- coding:utf-8 -*- - import sys import os, time from datetime…

97. 常用的HTTP服务压测工具

文章目录 导言一、ab二、wrk三、go-wrk 导言 在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug,同时了解了程序的实际处理能力能够帮我们更好的匹配项目的实际需求(服务器实例个数,如需要部署…