关于js的Object.defineProperty方法的使用

9 篇文章 0 订阅

一、关于Object.defineProperty

Object.defineProperty()是直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,一共有三个参数。

Object.defineProperty(object, propertyname, descriptor);

  • object:必须,要在其上添加或修改属性的对象。
  • propertyname:必需。 一个包含属性名称的字符串。
  • descriptor:属性描述符。 它可以针对数据属性或访问器属性。

descriptor:有以下参数值

  • value: 属性的值,默认为 undefined。 writable: 该属性是否可写,如果设置成
    false,则任何对该属性改写的操作都无效(但不会报错,但是在严格模式下会报错。),对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为
    true。
  • configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
  • enumerable:定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。
  • get: 对定义的属性取值的时候会触发get 对应的函数,并且返回结果,默认返回undefined。
  • set: 对定义的属性赋值的时候会触发set 对应的函数

二、 使用Object.defineProperty实现简单的双向数据绑定mvvm

双向数据绑定的原理是
mvvm 分为model(模型) view(视图) viewModel(视图模型)

  • model 用来存储数据
  • view 用来展示数据
  • ViewModel 关联数据,和model实现双向绑定。

将对象的属性绑定到view,具体的说,我们有一个对象,该对象有一个name属性,当我们给这个对象name属性赋新值的时候,新值在view上也会得到更新。同样的道理,当我们有一个输入框或者textarea的时候,我们输入一个新值的时候,也会在该对象的name属性得到更新。

下面是一个通过 Object.defineProperty 来实现一个简单的数据双向绑定。通过该方法来监听属性的变化。
实现的简单效果如下:
页面上有一个input输入框和h5显示框,在input输入框输入值,按下enter键时,h5也会显示对应的值,可以简单的理解为 模型-> 视图的 改变,以及 视图 -> 模型的改变。如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <h5 id="txtShow"></h5>
    <input type="text" id="txt">
  </div>
  <script>
    var model = {}
    var v = ''
    Object.defineProperty(model, 'txt', {
      // 设置属性值
      set: function(val) {
        v = val
        txtShow.innerHTML = this.txt;
      },
      // 获取属性值
      get: function () {
        return v
      }
    })
    var txtShow = document.getElementById('txtShow'),
      txt = document.getElementById('txt');
    txt.onkeyup = function() {
      if (event.keyCode == 13) {
        model.txt = txt.value;
      }
    }
  </script>
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值