回顾 object.defineProperty() 方法
区别defineProperty == 给对象定义属性用的
需要传递三个基本参数
- 需要定义属性的对象名
- 你要定义的属性叫什么名字(比如给person这个实体添加一个age属性)
- 配置项(对象类型的参数,里面存放键值对)
文章插图
<script>// 创建一个对象,该对象有两个基本属性var person = {name:"张三",sex:"男"}// 为person对象添加属性// 1、给那个对象添加?// 2、添加的属性名是什么?// 3、这个属性的基础配置项(对象类型,键值对形式)Object.defineProperty(person,"age",{value:18, // 该属性的值是})</script>
需求1- 给 对象person,添加一个属性age , 有几种方式?
- 三种
- 直接在 person对象当中添加属性;该属性值可以修改
文章插图
- 通过 .属性;对其设置;该属性值可以修改
文章插图
- 通过 Object.finedProperty()进行添加;该属性值不可枚举(不可修改) 默认情况下
文章插图
- 直接在 person对象当中添加属性;该属性值可以修改
文章插图
如果不设置配置项 , 那么该属性是不可枚举的;在控制台中可以看到 , 颜色变浅了
文章插图
该属性不参与遍历 , 我们可以测试下
文章插图
基本配置项value最开始配置的
文章插图
enumerable
文章插图
Object.defineProperty(person,"age",{value:18, // 该属性的值是enumerable:true, // 该配置项控制添加的属性是否参与枚举})
writable设置属性是否可以被修改文章插图
configurable控制属性是否可以被删除
没有通过函数添加age属性的person对象
文章插图
通过函数添加age属性的person对象删除属性
文章插图
设置配置项删除掉age属性
文章插图
需求2
- 准备一个变量 number,值为18
- person当中有一个age属性,这个属性的value 是 number(不是手写的18)
文章插图
问题所在
- 这个变量的值可能会发生改变,如果呢?
文章插图
- 修改number , person对象当中的age值并没有发生改变
- 同理,修改age,number也不会发生改变
文章插图
那怎么完成这个需求呢?
文章插图
请看下方的高级配置项
高级配置项get(getter)配置项
文章插图
解析
- 它的数据类型是一个对象
- 当 有人读取 person当中的age属性的时候,get就会被调用
- 且get的返回值就是age 的 value值
- 自定义get(getter函数)的时候,不能再使用基础配置了
文章插图
文章插图
三个点儿
- invoke:映射
- property:属性
- getter:get配置项 == 函数