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. 华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本

    摘要:GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效. 本文分享自华为云社区<华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本>,作者: G ...

  2. 谁说count(*) 性能最差,我需要跟你聊聊

    摘要:当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1).count(*).count(字段) 等.到底哪 ...

  3. 在距离distribution 证书过期一个月(或被手动revoke了)的时候会受到apple的邮件

    ​ ​编辑 虽然distribution过期(或者被手动revoke)了,如果你的开发者账号是company(公司)类型或个人类型的,只要你的每年99$的开发者membership没有过期,就不会对已 ...

  4. 火山引擎 ByteHouse:如何提升 18000 节点的 ClickHouse 可用性?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 ClickHouse 是业内被广泛使用的 OLAP 引擎.当集群规模过大时,ClickHouse 则面临使用局限性 ...

  5. 动作捕捉用于验证芭蕾舞动作对脑瘫儿童的作用 NOKOV度量动作捕捉

    下肢杠杆力臂功能障碍(Lever Arm Dysfunction,LAD)是常见的导致脑瘫儿童步态异常的原因,如髋内旋.股骨和胫骨之间的旋转畸形以及足的内外翻畸形等,且都与年龄的增长呈正相关.   图 ...

  6. IntelliJ IDEA 2024年最新下载、安装使用教程、亲测可用

    本文讲的是2023.3最新版本IntelliJ IDEA破解.IntelliJ IDEA激活码.IntelliJ IDEA安装.IntelliJ IDEA永久激活码的最新永久激活教程,本文有mac和w ...

  7. 深入浅出 WebRTC AEC(声学回声消除)

    前言:近年来,音视频会议产品提升着工作协同的效率,在线教育产品突破着传统教育形式的种种限制,娱乐互动直播产品丰富着生活社交的多样性,背后都离不开音视频通信技术的优化与创新,其中音频信息内容传递的流畅性 ...

  8. PySpark 报错 java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

    解决方案: mv mysql-connector-java-8.0.20.jar $SPARK_HOME/jars/ 驱动文件mysql-connector-java-8.0.20.jar是从mave ...

  9. Codeforces Round #728 (Div. 2) A~C 补题记录

    比赛链接:Here 1541A. Pretty Permutations 给定 \(1,2,3,4,...n\) 序列,让每一个数字都不处于原来的位置,但总的移动距离要最小 \(n\) 为偶数的情况 ...

  10. scroll-view横向滚动的问题

    最近在做一个小程序的项目,在写demo的时候,需要用到scroll-view来实现横向滚动的效果: 按照官方文档来写简直坑到家了,正确的写法如下: <scroll-view scroll-x=& ...