Object.defineProperty的基本使用

<script>
let personObj={
name:'何西亚',
sex:'男'
}
//我们想给这个对象添加一个属性
// 第一个参数是你要添加的对象名,
// 第二个参数你要添加的key值
// 第三个参数是 一个配置项 是个对象
Object.defineProperty(personObj,'age',{ value:35 })
//输出 {name: "何西亚", sex: "男", age: 35}
console.log( personObj);
</script>

为啥要使用 Object.defineProperty 添加key值

有的同学可能会说,我使用通过点和[]的方式难道不好吗
<script>
let personObj={
name:'何西亚',
sex:'男'
}
personObj['age']=35
personObj.height=1.86
//使用这一种方式也可以添加key值,难道这样不香吗
console.log(personObj);
</script> 这样是可以的,但是我使用 Object.defineProperty
是非常高级的
那么高级在哪里呢? 咳咳咳,使用 Object.defineProperty添加的key值,
是不会参与枚举
枚举:简单点说就是不会参与循环。[这样描述可能不太准确]
我们可以证明一下:Object.defineProperty添加的key值不会被遍历

Object.defineProperty添加的key值不会被遍历

<script>
let personObj={
name:'何西亚',
sex:'男'
}
Object.defineProperty(personObj,'age',{ value:35 })
// Object.keys()返回对象键名key组成的数组
console.log(Object.keys(personObj)); // [name,sex ]
//在这里我们发现age这个属性没有返回
//所以说明了【Object.defineProperty添加的key值不会被遍历】
</script>

想要 Object.defineProperty添加的key值被遍历

有的同学喜欢去钻牛角尖,说我非要去让它遍历。
也不是不可以,我们之前说过 Object.defineProperty
第三个参数是 一个配置项 是个对象
这样配置enumerable:true 表示可以枚举 let personObj={
name:'何西亚',
sex:'男'
}
//
Object.defineProperty(personObj,'age',{ value:35, enumerable:true })
// Object.keys()返回对象键名key组成的数组
console.log(Object.keys(personObj)); // [name,sex,age ]
//这个时候我们发现是可以枚举了

Object.defineProperty中key值是否可以被修改

<script>
let personObj={
name:'何西亚',
sex:'男'
}
Object.defineProperty(personObj,'age',{ value:35, enumerable:true })
personObj.age='350'
// 通过这样的方式,是不可以被修改的哈
console.log(personObj.age); //输出 35
</script> 如果我们想要age可以被修改,我们配置
let personObj={
name:'何西亚',
sex:'男'
}
//配置 enumerable:true,
Object.defineProperty(personObj,'age',{ value:35, enumerable:true,writable:true })
personObj.age='350'
// 这样就可以修改年龄了
console.log(personObj.age); //输出 350

Object.defineProperty中新增的key值可以被删除

let personObj={
name:'何西亚',
sex:'男'
}
// configurable:true 表示后面可以删除age这个属性,
// 正常情况下age是不可以被删除的哦!
Object.defineProperty(personObj,'age',{ value:35, configurable:true })
delete personObj.age
console.log(personObj)
输出 { name:'何西亚', sex:'男'}

需求描述

我们想这样操作:
一个对象中的某一个属性值去读取某一个变量
当这个变量的值发生变化后,对象中的那个属性值发生变化 let num=35
let personObj={
name:'何西亚',
sex:'男',
age:num
}
//输出35
console.log('修改前', personObj.age )
num=36
//修改后仍然输出35,但是我想让它输出36
console.log('修改后',personObj.age );

Object.defineProperty的get函数的使用

这个时候,Object.defineProperty的get函数的来帮助我们了!

<script>
let num=35
let personObj={
name:'何西亚',
sex:'男',
age:num
}
num=36
Object.defineProperty(personObj,'age',{
//当有人读取 personObj的age属性的时候
// 就会触发get函数【getter】,该函数就会被调用
// 函数的返回值就是age的值
get:function(){
console.log('读取age属性的时候回触发该函数')
return num
}
})
console.log('修改后',personObj.age ); //输出36
</script>

使用Object.defineProperty的set函数的原因

<script>
let num = 35
let personObj = {
name: '何西亚',
sex: '男',
age: num
}
num = 36 //可以修改age的值
Object.defineProperty(personObj, 'age', {
//当有人读取 personObj的age属性的时候
// 就会触发get函数【getter】,该函数就会被调用
// 函数的返回值就是age的值
get: function () {
console.log('读取age属性的时候回触发该函数')
return num
}
})
//后面通过这样的方式修改age的值会失败
personObj.age='350'
//本来我们期待是350,但是实际上是 36
console.log('修改后', personObj.age);
这个时候我们就需要使用set函数了,它就可以解决这个问题
</script>

Object.defineProperty中set函数的使用

<script>
let num=35
let personObj={
name:'何西亚',
sex:'男',
age:num
}
num=36
Object.defineProperty(personObj,'age',{
//当有人读取 personObj的age属性的时候
// 就会触发get函数【getter】,该函数就会被调用
// 函数的返回值就是age的值
get:function(){
console.log('读取age属性的时候回触发该函数')
return num
}, // 当有人修改age属性的时候,set函数【setter】就会被触发
// 且会收到修改的具体值
set:function(value){
console.log('修改age了',value)
// 修改后需要进行赋值,否者通过personObj.age='350'修改会失败
num=value
}
})
personObj.age='350'
console.log('修改后',personObj.age ); //输出350

Object.defineProperty熬夜整理的用法,保证你看的明白!的更多相关文章

  1. Object.defineProperty 中 get set 用法

    就是两个函数,只要搞清楚get.set的执行时机就可以了.执行时机如下代码: <!DOCTYPE html> <html lang="en"> <he ...

  2. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...

  3. 16、前端知识点--Object.defineProperty 的用法+双向数据绑定原理解析

    一.Object.defineProperty 的用法 Object.defineProperty 可以用于给对象添加更新属性. <script> // Object.defineProp ...

  4. JS apply的巧妙用法以及扩展到Object.defineProperty的使用

    Math.max 实现得到数组中最大的一项 var array = [1,2,3,4,5]; var max = Math.max.apply(null, array); console.log(ma ...

  5. Object.defineProperty基本用法

    1. 基本形式 Object.defineProperty(obj,prop,descriptor) 参数说明: obj: 必需,目标对象prop: 必需,需定义或修改属性的名字descriptor: ...

  6. vue双向数据绑定的原理-object.defineProperty() 用法

    有关双向数据绑定的原理 关于数据双向绑定的理解:利用了 Object.defineProperty() 这个方法重新给对象定义了新属性,在操作新属性分别为为获取属性值(调用get方法)和设置属性值(调 ...

  7. 对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法

    1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子: var obj = { na ...

  8. vue中Object.defineProperty用法

    function def (obj, key, val, enumerable) { Object.defineProperty(obj, key, { value: val, enumerable: ...

  9. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  10. 利用object.defineProperty实现数据与视图绑定

    如今比较火的mvvm框架,例如vue就是利用es5的defineProperty来实现数据与视图绑定的,下面我来介绍一下defineProperty的用法. var people= {} Object ...

随机推荐

  1. 【“互联网+”大赛华为云赛道】GaussDB命题攻略:支持三种开发语言,轻松完成数据库缓冲池

    摘要:七届中国国际"互联网+"大学生创新创业大赛火热报名中,为了帮助参赛者更好了解赛题设计思路和命题方向,华为云产业命题赛道举行了线上直播解读,华为云数据库资深架构师苏斌在直播间详 ...

  2. 云图说|初识云数据库GaussDB(for Redis)

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:云数据库Gauss ...

  3. Centos7 怎么永久关闭防火墙

    1.连接到centos主机,然后输入命令"systemctl status firewalld.service"并按下回车键. 2.然后在下方可以查看得到 " activ ...

  4. 无法获得数据库 'model' 上的排他锁。请稍后重试该操作

    标题: Microsoft SQL Server Management Studio 数据库 "XXXX" 的 创建 失败. (Microsoft.SqlServer.Smo) 有 ...

  5. .Net Core NLog 配置

    using NLog; private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类 NLog.config ...

  6. JAVA CRC16

    JAVA CRC16 /** * CRC-16 * * <table width="400px" border="1" cellpadding=" ...

  7. AC(AtCoder) Library 文档翻译

    AC(AtCoder) Library Document下载使用 如何安装 首先在 Github 上找到 ac-library 仓库.下载最新版本 解压 zip 文件后将 atcoder ,放置GCC ...

  8. Educational Codeforces Round 99 (Rated for Div. 2) (A ~ F)个人题解

    Educational Codeforces Round 99 (Rated for Div. 2) A. Strange Functions 读懂题即可(或者快速看一下样例解释),直接输出字符串长度 ...

  9. springboot项目统一封装返回值和异常处理(方式一)

    为什么要统一返回值: 在我们做后端应用的时候,前后端分离的情况下,我们经常会定义一个数据格式,通常会包含code,message,data这三个必不可少的信息来方便我们的交流,下面我们直接来看代码pa ...

  10. 通义千问预体验,如何让 AI 模型应用“奔跑”在函数计算上?

    立即体验基于函数计算部署通义千问预体验: https://developer.aliyun.com/topic/aigc_fc AIGC 浪潮已来,从文字生成到图片生成,AIGC 的创造力让人惊叹,更 ...