js对象劫持

本文详细介绍了JavaScript的Object.defineProperty()方法,用于在对象上创建拦截器,实现数据劫持。通过数据描述符和存取描述符,控制属性的读写权限。在Vue框架中,这一机制用于实现数据的双向绑定,当属性值改变时自动更新视图。通过设置get和set方法,可以监听并处理数据变化。示例代码展示了如何利用这一特性实现数据的监听和更新。

JS对象劫持

Object.defineProperty()在目标对象之前加一层"拦截",外界对该对象的访问,都必须先通过这层拦截,对此,提供了一种机制,可以对外界的访问进行过滤和改写。这种机制就称对象劫持。
Vue能够在修改属性时, 修改视图, 使用的就是 Object.defineProperty()

语法

Object.defineProperty(obj, prop, desc)

  1. obj 需要定义属性的对象

  2. prop 当前定义的属性名

  3. desc 描述符

描述符分为两种, 分别为数据描述符 存取描述符

数据描述符

  1. value 表示它的默认值
  2. writable 如果为true标识可以被修改,如果为false标识不能被修改(默认值为false)
  3. configrable 描述属性是否配置,以及可否删除,可以认为是总开关 默认值 false(不可删除)
  4. enumerable 描述属性是否出现在for in 或者 Object.keys()的遍历中 默认值false(不能遍历)
    ==value和writable不能和set get共存 ==
let obj = {};
Object.defineProperty(obj, 'name', {
    value: '张三'
})
obj.name = '李四'
console.log(obj.name) // 张三
let obj = {};
Object.defineProperty(obj, 'name', {
    value: '张三',
    writable: true
})
obj.name = '李四'
console.log(obj.name) // 李四
let obj = {};
  Object.defineProperty(obj, 'name', {
    value: '张三',
    writable: true,
    configurable: true,
    enumerable: true
  })
  obj.name = '李四'
  // delete obj.name
  console.log(obj.name) // 李四
  console.log(Object.keys(obj)) // ['name']

存取描述符

包括 setget 方法, 获取属性时会触发 get 方法 设置属性时会触发 set 方法

let obj = {}
Object.defineProperty(obj, 'name', {
  get() {
    console.log('触发set方法')
    return '张三'
  },
  set(val) {
    console.log('触发get方法')
  }
})

obj.name = '李四'
console.log(obj.name)
// 触发get方法
// 触发set方法
// 张三

get 固定返回’李四’, 所以无法设置新的属性. obj.name = '李四’触发了set, obj.name触发了get

实现监听数据变化
let obj = {}
let temp = null
Object.defineProperty(obj, 'name', {
  get() {
    return temp
  },
  set(val) {
    temp = val
    // 数据变化时触发下面操作
    console.log(obj.name)
  }
})

obj.name = '李四' // 李四

原文链接:https://blog.youkuaiyun.com/weixin_46021808/article/details/115641283

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值