Object.defineProperty

Object.defineProperty,之前一直都是似懂非懂,每次说到vue双向绑定,只知道有个get set,后来阅读了【这篇文档】有点醍醐灌顶,算是懂了也记住了,现在记录一下,有需要的小伙伴可以看看,说的不对的欢迎指出。

 

一般我们创建一个对象都是 let obj = {key1:"属性值1"} ,那通过【Object.defineProperty】我们怎么定义一个对象的属性呢?

Object.defineProperty(obj, prop, descriptor)
obj:定义的对象
prop:对象的属性字段
descriptor:定义或修改的属性描述符
1. descriptor,定义或修改的属性描述符,它是一个对象,它包含有6种属性:

1. configurable:布尔类型,是否允许修改或删除这个属性,默认是true;
2. enumerable:布尔类型,在for in中是否允许访问该属性,默认是true;
3. value: 设置该属性的值;
4. writable:布尔类型,与configurable一样,是否允许修改或展示这个属性,默认是true;
5. get:方法,读取属性值时会执行,没有任何参数,但会传入 this 对象;
6. set:方法,赋值属性值时会执行,方法接受一个参数,即新的赋值,也会传入 this 对象;

下面我们就对以上的6个属性来依次试试,看看效果是怎样:


 

 

 2.get、set

get和set的方式,在获取某个属性值时,或者给某个属性赋值时,就会执行对应的方法,这两个方法便于用户在获取或赋值时做其他的逻辑处理。比如原来面试最常见的【obj.key===1&&obj.key===2&&obj.key===3,怎么实现obj对象中的key属性值等于1 2 3?关键点就是在get方式上做操作,get这个方法return什么,那这时候获取属性值就是什么。

 

 

 

 

 3. 模拟vue2的双向绑定

<input class="input" name="input" style="width: 400px" />
<div class="div" style="color: red"></div>

window.data = {};
let input = document.querySelector(".input");

Object.defineProperty(window.data, "value", {
    set: function (v) {
        let div = document.querySelector(".div");
        div.innerHTML = v;
    },
  get:function(){
    return "";
  }
});

input.addEventListener("input", (e) => {
    window.data.value = e.target.value;
});

 

 

 


 

 
posted @ 2022-08-11 17:15  蛙仔  阅读(89)  评论(0编辑  收藏  举报