Object.defineProperty熬夜整理的用法,保证你看的明白!
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熬夜整理的用法,保证你看的明白!的更多相关文章
- Object.defineProperty 中 get set 用法
就是两个函数,只要搞清楚get.set的执行时机就可以了.执行时机如下代码: <!DOCTYPE html> <html lang="en"> <he ...
- Object.defineProperty()方法的用法详解
Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...
- 16、前端知识点--Object.defineProperty 的用法+双向数据绑定原理解析
一.Object.defineProperty 的用法 Object.defineProperty 可以用于给对象添加更新属性. <script> // Object.defineProp ...
- JS apply的巧妙用法以及扩展到Object.defineProperty的使用
Math.max 实现得到数组中最大的一项 var array = [1,2,3,4,5]; var max = Math.max.apply(null, array); console.log(ma ...
- Object.defineProperty基本用法
1. 基本形式 Object.defineProperty(obj,prop,descriptor) 参数说明: obj: 必需,目标对象prop: 必需,需定义或修改属性的名字descriptor: ...
- vue双向数据绑定的原理-object.defineProperty() 用法
有关双向数据绑定的原理 关于数据双向绑定的理解:利用了 Object.defineProperty() 这个方法重新给对象定义了新属性,在操作新属性分别为为获取属性值(调用get方法)和设置属性值(调 ...
- 对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法
1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子: var obj = { na ...
- vue中Object.defineProperty用法
function def (obj, key, val, enumerable) { Object.defineProperty(obj, key, { value: val, enumerable: ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- 利用object.defineProperty实现数据与视图绑定
如今比较火的mvvm框架,例如vue就是利用es5的defineProperty来实现数据与视图绑定的,下面我来介绍一下defineProperty的用法. var people= {} Object ...
随机推荐
- 火山引擎DataLeap基于Apache Atlas自研异步消息处理框架
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 字节数据中台DataLeap的Data Catalog系统通过接收MQ中的近实时消息来同步部分元数据.Apache ...
- faker造数据
faker是一个开源的python库,安装完成后只需要调用Facker库,就可以帮助我们创建需要的数据. pip install Faker demo from faker import Faker ...
- C# 完美实现物联网 MQTT 数据通信
前言 MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低.占用带宽低.即时通讯等优点,使其在物联网.小型设备.移动应用等方面有较广泛的应用,在工业物联网中, ...
- LeetCode75 颜色分类 (三路快排C++实现与应用)
三路快排是快速排序算法的升级版,用来处理有大量重复数据的数组. 主要思想是选取一个key,小于key的丢到左边,大于key的丢到右边,递归实现即可. 具体操作过程参考:https://blog.csd ...
- StringBuilder 线程不安全,到底哪里不安全?
StringBuilder 线程不安全,到底哪里不安全? 在Java中,字符串拼接是一个非常常见的操作,而对于频繁变动的字符串内容,使用StringBuilder是一个性能优化的选择.但是,Strin ...
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 解决
Navicat 连接mysql 执行 CREATE TABLE 语句 执行成功后总是包如下错误 [Err] 1055 - Expression #1 of ORDER BY clause is no ...
- vue学习笔记 七、方法的定义和使用
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- Springboot+ELK实现日志系统简单搭建
前面简单介绍了ELK三剑客中的其中两个Elasticsearch和Kibana的简单使用,如果对这两个不了解,可以看下下面的 Centos7安装Elasticsearch和Kibana 搜索引擎基础- ...
- 【Linux】技术收集
Linux进程间通信(六)---信号量通信之semget().semctl().semop()及其基础实验 https://blog.csdn.net/mybelief321/article/deta ...
- 用CI/CD工具Vela部署Elasticsearch + C# 如何使用
Vela 除了可以帮我们编译.部署程序,利用它的docker部署功能,也能用来部署其他线上的docker镜像,例如部署RabbitMQ.PostgreSql.Elasticsearch等等,便于集中管 ...