欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Object.defineProperty实现一个简单的MVVM双向绑定

程序员文章站 2022-07-12 22:42:21
...

一、Object.defineProperty介绍

该函数可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

通俗理解就是:给对象添加一个新的属性,或者针对对象里的某些属性,可以给这个属性设置一些特性,比如是否只读,是否可以被for…in或Object.keys()遍历等。

1.语法

Object.defineProperty(obj, prop, descriptor)

其中obj是要在上面定义属性的对象,prop是要定义或修改的属性名称,descriptor是属性的描述符。

例如:

var obj = {};

Object.defineProperty(obj, "key", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: "static"
});

2.设置特性的方式有2种:数据描述符和存取描述符
利用Object.defineProperty实现一个简单的MVVM双向绑定

  • configurable: 是否可以删除目标属性或是否可以再次修改属性的特性。
  • enumerable: 此属性是否可以被枚举(使用for…in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
  • value: 属性对应的值,可以使任意类型的值,默认为undefined。
  • writable: 属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。
  • getter :是一种获得属性值的方法,默认值为undefined。
  • setter:是一种设置属性值的方法,默认值为undefined。

二、实现一个简单的MVVM

通过Object.defineProperty(obj, prop, descriptor)劫持对象的属性读写。

//MVVM 实现input输入框和show双向绑定
function defineProperty(obj, attr){
    Object.defineProperty(obj, attr, {
        get:function(){
            return this.attr;
        },
        set:function(val){
            if(this.attr == val) return;
            this.attr = val;
            document.getElementById('show').innerHTML = val;
        }
    })
}

var obj = {};
defineProperty(obj, 'txt');
document.getElementById('input').addEventListener('keyup', function(e){
    obj.txt = e.target.value;
})

参考文章

https://juejin.cn/post/6844903785844703240
https://blog.csdn.net/hefeng6500/article/details/75194506
https://www.cnblogs.com/soraly/p/10305157.html

相关标签: javascript 前端