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. 鲲鹏BoostKit虚拟化使能套件,让数据加密更安全

    摘要:借助华为鲲鹏BoostKit虚拟化使能套件(简称鲲鹏BoostKit虚拟化),可加速迈向云计算之旅.本次KAE加速引擎让数据加密更安全直播将介绍鲲鹏BoostKit加速库全景,基于BoostKi ...

  2. 火山引擎DataLeap:助力PICO落地数据流程规范,提升开发效率

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   作为目前中国市场领跑的头部XR品牌之一,字节跳动旗下的PICO已经拥有了超百万客户.   过去一年,PICO在 ...

  3. Chrome浏览器导出HTTPS证书

    点证书小锁 进入证书界面 到详情中,导出证书

  4. 第一章 Linux系统编程

    Linux基础命令 ctrl + l //快速清屏 rm 文件名 //删除文件,rm *.o表示删除所有.o后缀的文件 mkdir 目录名 //创建一个目录 touch 文件名 //创建一个文件 tr ...

  5. Windows Tools | How To Install VS Microsoft C++ Build Tools on Windows

    This can be used for installing anything that requires C++ compiler on Windows. Installation steps D ...

  6. Codeforce:723A. The New Year: Meeting Friends (水题)

    题意:有三个好朋友的家都住在x轴的不同坐标,问新年的时候三个朋友之间问候走的最短距离 max{(a,b,c)} - min{(a,b,c)} 即可 编译器由 VS2017 切换到VScode使用,纪念 ...

  7. 【每日一题】15.Xorto (前缀和枚举)

    补题链接:Here 题意:选取任意不重叠的两个区间,使异或结果为 \(0\) 样例:\(1,2,3,4,5,5\) 在样例中我们可以选取 \(1,2,3\) 和 \(5,5\) 就是满足题意 思路:相 ...

  8. 彻底搞懂 IO 底层原理

    武侠小说里有很多的"心法"和"招式".计算机技术里的"心法"和"招式"呢,我们可以简称为"道"和&q ...

  9. 【调试】kdump原理及其使用方法

    kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...

  10. vue2+高德地图web端开发

    https://blog.csdn.net/qq_51553982/article/details/123014412