创建对象的方式和对属性的操作
javaScript支持多种编程范式,包括函数式编程和面向对象编程,javaScript的对象被设计成一组属性的无序集合,由key和value组成。
创建对象的两种方式
- 早期使用创建对象方式最多的是使用Object类,使用new关键字来创建一个对象,这是因为早期很多javaScript开发者是从java过来的,他们也更习惯于java中通过new的方式创建一个对象。
let obj = new Object
obj.name = '小明'
obj.age = 18
- 后来很多开发者为了方便,都直接通过字面量的形式来创建对象,这种形式看起来更加的简洁,并且对象和属性之间的内聚性也更强。
let obj = {name: '小明',age: 18
}
对属性操作的控制
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj:要定义的属性
prop:要定义或修改的属性名称或Symbol
descriptor:要定义或修改的属性描述符
返回值
被传递给函数的对象,也就是obj

对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。一个属性描述符只能是这两者其中之一;不能同时是两者。

如果一个描述符不具有 value、writable、get 和 set 中的任意一个键,那么它将被认为是一个数据描述符。如果一个描述符同时拥有 value 或 writable 和 get 或 set 键,则会产生一个异常。
数据数据描述符有如下四个特性:
1 .configurable
表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符;
- 当我们直接在一个对象上定义某个属性时,这个属性的[[Configurable]]为true;
- 当我们通过属性描述符定义一个属性时,这个属性的[[Configurable]]默认为false;
- 为false时 ,如果writable为true可修改其为false,如果writable为false,不能修改其为true
2 .Enumerable
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中,表示属性是否可以通过for-in或者Object.keys()返回该属性;
- 当我们直接在一个对象上定义某个属性时,这个属性的Enumerable为true;
- 当我们通过属性描述符定义一个属性时,这个属性的Enumerable默认为false;
3. Writable
表示是否可以修改属性的值
- 当我们直接在一个对象上定义某个属性时,这个属性的[[Writable]]为true;
- 当我们通过属性描述符定义一个属性时,这个属性的[[Writable]]默认为false;
4. value
属性的value值,读取属性时会返回该值,修改属性时,会对其进行修改
- 默认情况下这个值是undefined;
存取属性描述符有如下四个特性:
1. configurable
同数据描述符
2. Enumerable
同数据描述符
3. get
获取属性时会执行的函数。默认为undefined
3. set
设置属性时会执行的函数。默认为undefined
描述符默认值汇总
- 拥有布尔值的键 configurable、enumerable 和 writable 的默认值都是 false。
- 属性值和函数的键 value、get 和 set 字段的默认值为 undefined。
添加多个属性和默认值
考虑特性被赋予的默认特性值非常重要,通常,使用点运算符和 Object.defineProperty() 为对象的属性赋值时,数据描述符中的属性默认值是不同的,如下例所示。
var o = {};o.a = 1;
// 等同于:
Object.defineProperty(o, "a", {value: 1,writable: true,configurable: true,enumerable: true
});// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于:
Object.defineProperty(o, "a", {value: 1,writable: false,configurable: false,enumerable: false
});
同时定义多个属性
Object.defineProperties() 方法直接在一个对象上定义 多个 新的属性或修改现有属性,并且返回该对象
Object.defineProperties(obj, {name: {configurable: true,enumerable: true,writable: true,value: "why"},age: {configurable: true,enumerable: true,get: function() {return this._age},set: function(value) {this._age = value}}
})
对象方法补充
- getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
语法
Object.getOwnPropertyDescriptor(obj, prop)
参数
obj:需要查找的目标对象
prop:目标对象内属性名称
例
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
// configurable: true,
// enumerable: true,
// value: 42,
// writable: true
// }
- getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。
语法
Object.getOwnPropertyDescriptors(obj)
参数
obj:任意对象
返回值
所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
- Object.preventExtensions()
Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
语法
Object.preventExtensions(obj)
参数
obj:将要变得不可扩展的对象
返回值
已经不可扩展的对象。
- Object.seal()
Object.seal() 方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
语法
Object.seal(obj)
参数
obj:将要被密封的对象。
返回值
被密封的对象。
- Object.freeze()
Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
语法
Object.seal(obj)
参数
obj:要被冻结的对象。
返回值
被冻结的对象。
相关文章:
创建对象的方式和对属性的操作
javaScript支持多种编程范式,包括函数式编程和面向对象编程,javaScript的对象被设计成一组属性的无序集合,由key和value组成。 创建对象的两种方式 早期使用创建对象方式最多的是使用Object类,使用new关键字来创建一个对象&…...
GO时间相关操作说明
文章目录 GO时间相关操作时间转换成字符串字符串转换成时间时间戳和时间操作时间比较操作时间增加和减少操作休眠操作time.AfterFunc操作time.NewTicker操作GO时间相关操作 GO语言在使用时间转换的时候会用到2006-01-02 15:04:05 这是固定参数写法,类似java语言中的yyyy-M…...
选择和分支结构
选择和分支结构选择和分支结构一、复习问答二、选择结构2.1 基础选择结构2.2 if-else结构2.3 多重if结构2.4 嵌套if结构三、分支结构四、局部变量选择和分支结构 一、复习问答 1、Java中基本数据类型 2、类型的转换的两种情形 3、数据类型提升的规则 二、选择结构 2.1 基础选…...
Elasticsearch总结笔记
文章目录简介类型增删改查操作索引原理简介 底层使用的lucene引擎,lucene引擎直接使用相对复杂,有一定的学习成本,同样是使用Java编写,Elasticsearch使用的rest风格的进行交互,而数据呢则是以JSON的方式进行传输。学习…...
Ubuntu 安装指定版本 Mysql,并设置远程连接(以安装mysql 5.5 为例)
目录 一、安装Mysql 1、卸载Mysql(可跳过) 2、安装mysql 软件源 3、安装mysql 5.5 4、验证测试 二、设置远程登录 1、允许使用root账号远程连接 2、Mysql 允许远程登录 一、安装Mysql 1、卸载Mysql(可跳过) 如果之前安装…...
NumPy:Python中的强大数学工具
NumPy:Python中的强大数学工具 文章目录NumPy:Python中的强大数学工具一、NumPy简介二、创建数组三、数组尺寸四、数组运算五、数组切片六、数组连接七、数据存取八、数组形态变换九、数组排序与搜索十、矩阵与线性代数运算一、NumPy简介 当谈到数据科学…...
Hbase资源隔离操作指南
1.检查集群的环境配置 1.1 HBase版本号确认> 5.11.0 引入rsgroup的Patch: [HBASE-6721] RegionServer Group based Assignment - ASF JIRA RegionServer Group based Assignment 社区支持版本:2.0.0 引入rsgroup的CDH版本 5.11.0 https://www.…...
TPS2012B泰克Tektronix隔离通道示波器
简 述: 复杂环境中开发和测试你的设计,进行浮动或差 分测量;100MHz,2通道 主要特点和优点 100 MHz和200 MHz带宽 高达2 GS/s的实时采样率 2条或4条全面隔离和浮动通道,外加隔离外部触 发 在安装两块电池时可以连续…...
9.4 PIM-DM
实验目的 熟悉PIM-DM的应用场景掌握PIM-DM的配置方法 实验拓扑 实验拓扑如图9-28所示: 图9-28:PIM-DM 实验步骤 (1)IP地址的配置 MCS1的配置如图9-29所示: 图9-29:配置MCS1的IP地址 R1的配置 <Huawe…...
程序员推荐的良心网站合集!
今天来给大家推荐几个程序员必看的国外良心网站合集。 IBM developer 技术性很强的博客网站,网站自带真实示例代码和架构解决方案,大家可以在上面找到适合自己的语言方向开始学习交流。 https://developer.ibm.com/ infoq 技术论坛社区,内…...
信息安全概论之《密码编码学与网络安全----原理与实践(第八版)》
前言:在信息安全概论课程的学习中,参考了《密码编码学与网络安全----原理与实践(第八版)》一书。以下内容为以课件为主要参考,课本内容与网络资源为辅助参考,学习该课程后作出的总结。 一、信息安全概述 1…...
跬智信息全新推出云原生数据底座玄武,助力国产化数据服务再次升级
2月28日,跬智信息(Kyligence)宣布全新推出国产化云原生数据底座开源项目玄武(XUANWU),以助力企业加速数据平台上云,并实现国产化升级。玄武(XUANWU)是在容器化技术上形成…...
【离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载】
离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载离线数仓-9-数据仓库开发DWS层设计要点-DWS层汇总表以及数据装载一、交易域用户商品粒度订单最近1日/N日汇总表1.交易域用户商品粒度订单最近1日汇总表2.交易域用户商品粒度订单最近N日汇总表二、交易域优惠券粒度…...
我的十年编程路 序
算起来,从决定并从事编程开始,已十年有余了。 这十年是怎么算的呢? 我的本科是从2009年至2013年,现在回想起来,应该是从2012年下半年,也就是大四还未正式开始的时候决定从事Android开发。参加了培训班&am…...
xs 180
选择题(共180题,合计180.0分) 1. 你被任命为某项目的敏捷教练,为了更好的交付产品,你与团队召开会议,讨论项目过程中团队应该如何做到有效沟通。最有可能确定项目过程中主要以下列哪种方式沟通? A 团队成员在各自的办公室自行办公&#…...
时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序)
时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序) 目录 时间序列分析 | BiLSTM双向长短期记忆神经网络时间序列预测(Matlab完整程序)预测结果评价指标基本介绍完整程序参考资料预测结果 评价指标 训练集数据的R2为:0.99302 测试集数据的R2为&…...
0101基础-认证授权-springsecurity
文章目录1 基础概念1.1 认证1.2 会话1.3 jwt1.4 授权2 授权的数据模型3 RBAC3.1 基于角色的访问控制3.2 基于资源的访问控制4 名词解析4.1 SSO4.2 CAS4.3 联合登陆4.4 多端登录:同一账号不同终端登录4.5 OAuth1 基础概念 1.1 认证 认证是为了保护系统的隐私数据和…...
一文简单了解THD布局要求
一、什么是THD? THD指总谐波失真。谐波失真是指输出信号比输入信号多出的谐波成分。谐波失真是系统不完全线性造成的。所有附加谐波电平之和称为总谐波失真。总谐波失真与频率有关。一般说来,1000Hz频率处的总谐波失真最小,因此不少产品均以…...
[C++]多态
🥁作者: 华丞臧 📕专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 文章目录一、多态…...
中国版ChatGPT高潮即将到来,解密ChatGPT底层网络架构
2022年11月30日人工智能研究实验室OpenAI发布全新聊天机器人ChatGPT,在中国用户无法访问的前提下,上线仅两个月月活用户就突破了1亿。ChatGPT如同重磅炸弹,一时间火遍全球。面对这一万亿级市场机遇,在国内,无论是资本方…...
2026年小学英语学习小程序排行榜
对于小学生而言,英语学习早已打破“只背单词、只刷习题”的单一模式,听、说、读、写全方位同步训练,才是提升英语能力的关键。2026年,市面上涌现出多款优质小学英语学习小程序,覆盖单词记忆、听力训练、阅读提升、语法…...
OpenClaw怎么部署?2026年3月OpenClaw(Clawdbot)在阿里云一键部署超全教程
OpenClaw怎么部署?2026年3月OpenClaw(Clawdbot)在阿里云一键部署超全教程。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环…...
告别向日葵和TeamViewer!用你家路由器自带的DDNS功能,免费搭建Windows远程桌面(保姆级教程)
告别第三方远程工具:用路由器DDNS解锁Windows远程桌面全速体验 每次打开向日葵或TeamViewer时,那个转圈加载的进度条是否让你眉头紧锁?当免费版突然弹出"会话时长已达上限"的提示时,是否恨不得砸键盘?作为常…...
别光知道Levenshtein!Python实战:用Jaro-Winkler算法搞定人名地址模糊匹配
别光知道Levenshtein!Python实战:用Jaro-Winkler算法搞定人名地址模糊匹配 在数据清洗和用户输入处理的场景中,字符串相似度计算是个绕不开的话题。当我们需要匹配"张三丰"和"张三風"时,传统的Levenshtein距离…...
【基于Tube的非线性系统模型预测控制MPC】基于鲁棒控制不变集的管式模型预测控制方案及其在利普希茨非线性系统中的应用附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
VSCode党必看!用轻量级方案玩转LaTeX:2024年TexLive+VSCode配置全攻略
VSCode党必看!用轻量级方案玩转LaTeX:2024年TexLiveVSCode配置全攻略 对于习惯在VSCode中高效编码的开发者而言,切换到传统LaTeX编辑器往往意味着要放弃熟悉的快捷键、扩展生态和流畅的代码体验。本文将带你用完全基于VSCode的轻量级方案构建…...
自然语言处理助力法律领域AI架构,提升司法服务质量
自然语言处理助力法律领域AI架构:从技术落地到司法服务升级的全链路实践 1. 引言:法律行业的“效率痛点”与NLP的破局之路 1.1 痛点引入:当法律遇到“信息过载”与“专业门槛” 深夜十点的律师办公室里,张律师还在揉着太阳穴核对第三份合同的条款——密密麻麻的法条引用…...
【adb端口5555】烽火hg680系列安卓9线刷全攻略:告别强制升级与花屏困扰
1. 烽火HG680系列机顶盒的痛点与解决方案 最近在折腾烽火HG680-GY和HG680-GC这两款机顶盒的朋友应该都深有体会,官方系统用着用着就会弹出强制升级提示,有时候还会莫名其妙出现花屏问题。作为一个折腾过不下20台烽火盒子的老玩家,我太理解这种…...
ICRS-101机器人手动控制API协议设计与嵌入式实现
1. ICRS_101_API 项目概述ICRS_101_API 是一套面向教育与科研场景的机器人手动控制接口规范,专为 ICRS-101 型教学机器人平台设计。该 API 并非独立运行的固件或中间件,而是一组定义清晰、硬件无关的通信协议与软件抽象层,其核心目标是为上位…...
软件信创方案(Word)
第1章 需求分析1.1 核心项目需求自主可控、资源池、云平台建设、运维运营管理、安全系统五大核心需求第2章 云平台基础设施设计2.1 改造目标与定位2.2 设计原则2.3 总体架构设计含网络架构、云平台整体架构2.4 资源配置设计含网络、计算、数据库、存储资源池及云管模块设计第3章…...
