对象高级
21:对象高级
一、数据劫持
- 数据劫持:能够拦截到数据被使用或被修改的时机,在这个时机除了可以获取数据的值或对数据的值进行修改之外,还可以执行其他功能。
- 当对数据进行修改时,除了要修改数据自身之外,还希望对所有使用了该数据的位置进行同步修改。
对象的访问器属性
- 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get 和 set 表示:
1 | let obj = { |
- 当读取 obj.msg 时,getter 起作用,当 obj.msg 被赋值时,setter 起作用。
- 从外表看,访问器属性看起来就像一个普通属性。这就是访问器属性的设计思想。我们不以函数的方式调用,我们正常读取它,getter 会在幕后运行。
- 如果,访问器属性只有一个 getter。在赋值操作 obj.msg = xxx,将会出现错误:Error(属性只有一个 getter)
- 这样就会有一个“虚拟”的属性,它是可读且可写的。我们会利用这种方式进行数据劫持。
二、Object.defineProperty()
Object.defineProperty(对象, 属性名, { 配置项 })
- 配置项:
value
:该属性对应的值writable
:该属性是否可被重写,默认是 falseenumerable
:该属性是否可被枚举,默认是 falseget
:是一个函数, 叫做 getter 获取器,可以来决定该属性的值- get 函数的返回值, 就是当前这个属性的值
- 注意: 不能和
value
和writable
一起使用,会报错
set
:是一个函数,叫做 setter 设置器,当你需要修改该属性的值的时候,会触发该函数
1 | Object.defineProperty(obj, 'age', { |
- 升级版:
Object.defineProperties(对象, { 配置项组 })
- 配置项组,键为属性名,值为当前属性的配置项
1 | Object.defineProperties(obj, { |
- 注意:
Object.defineProperty
和Object.defineProperties
无法劫持后来添加的属性
三、数据代理Proxy()
- ES6新增的本地对象,语法为:
new Proxy(原始对象, { 配置项 })
- 返回值就是代理之后的对象
1 | const obj = { name: 'Jack', age: 18 } |
四、补充
1. Object类新增方法
Object.create(obj, { 配置项组 })
- 创建(返回)一个新对象,这个新对象的
__proto__
指向obj
- 配置项组,键为新对象的属性名,值为当前属性的配置项
- 配置项,参考
Object.defineProperty()
的配置项
- 配置项,参考
- 创建(返回)一个新对象,这个新对象的
Object.is(value1, value2)
- 判断两个
value
是否是相同的值,返回值为布尔值
- 判断两个
Object.assign(obj1, obj2)
- 将
obj2
合并到obj1
,并返回合并之后的obj1
- 将
Object.keys(obj)
- 返回对象所有可被枚举的
key
,以数组的形式呈现
- 返回对象所有可被枚举的
Object.values(obj)
- 返回对象所有可被枚举key的
value
,以数组的形式呈现
- 返回对象所有可被枚举key的
Object.setPrototypeOf(obj, prototype)
- 修改
obj
的__proto__
指向指定的prototype
,prototype
为对象
或null
,返回值为修改后的obj
- 修改
Object.getPrototypeOf(obj)
- 获取并返回
obj
的原型对象
- 获取并返回
2. Array类新增方法
Array.from( 参数 )
- 根据指定参数创建新数组,要求该参数可被迭代。
- 可根据伪数组创建真数组,实现伪转真
- 数组的深拷贝
Array.of( 数据, ... )
- 根据指定数据创建数组,类似
Array( 数据, ... )
,但Array.of( 数据, ... )
接收一个数值型数据时,不会作为长度
- 根据指定数据创建数组,类似
Array.isArray( 数据 )
- 判断指定数据是否为数组,返回值为布尔值
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 !
评论