object.defineProperty()用法

概念

  • object.defineProperty用来定义对象的一些属性,或者修改一些已存在的属性
  • 语法糖为object.defineProperty(obj,name,desc) 这个方法需要传三个参数,obj是要修改的的对象,name是对其设置的属性名,最后一个是属性描述符
  • 一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性
  • 通过Object.defineProperty()为对象定义属性,有两种形式,一种是数据描述符和存取描述符

数据描述符:

只有两个值 value和writable(writable是设置这个属性是不是能被改变),例如:

//用defineProperty进行数据描述符的操作
     let obj1 = {}
     Object.defineProperty(obj1, 'name',{
       value: '11',
       writable: true//新建的这个属性是否能被修改,不设置默认是false代表不能被修改 
     })
     console.log(obj1.name) //输出11
     obj1.name = 2
     console.log(obj1.name)//输出2

存取描述符

是由一对 getter、setter 函数功能来描述的属性:

let obj2 = {}
      let c = '这是存取描述符'
      Object.defineProperty(obj2,'name',{
        get:function(){
          return c
        },
        set:function(val){
          c = val
          // this.name = val
        }
      })
      console.log(obj2.name) // 输出这是存取描述符
      obj2.name='更改属性'
      console.log(obj2.name) //输出更改属性

# 数据描述符和存取描述均具有(configurable,enumerable )属性
  1. configurable该属性值是否能被删除 ,默认是false 不能被删除
  2. enumerable 该属性是否能被遍历(出现在for,Object.keys()中),默认是false 不能被遍历
  3. 所以不管是共有的configurable,enumerable也好还是数据描述符中的writable也罢,都是默认false,说白了就是默认不可删除 不可修改 不可遍历
let obj2 = {}
   let c = '这是存取描述符'
   Object.defineProperty(obj2, 'name', {
     get: function() {
       return c
     },
     set: function(val) {
       c = val
       // this.name = val
     },
     configurable: true,
     enumerable: true
   })
   console.log(Object.keys(obj2)) //输出['name']
   delete obj2.name
   console.log(obj2.name) //输出undefind

vue的基本基本数据劫持就是用的这个方式,下面一个简单的数据劫持例子

  <input type="text" name="" id='input1' value="">
  <span id="span1"></span>



var input1 = document.querySelector('#input1')
    var span1 = document.querySelector('#span1')
    let data = {}
    let value = '开始'
    Object.defineProperty(data, 'name', {
      get: function() {
        return value
      },
      set: function(val) {
        value = val
        span1.innerHTML = value
      }
    })
    input1.addEventListener("keyup", function() {

      data.name = this.value
      // console.log("实现 视图 => 模型");
    }, false)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值