原生js双向数据绑定

前面咱们介绍过存储器属性(从新认识javascript对象(一)——对象及其属性),以及如何用Object.defineProperty()定义一个存储器属性,今天咱们介绍如何用Object.defineProperty()实现双向数据绑定。javascript

咱们知道一个存储器属性有四个属性描述符:get,set,configurable,enumerable。咱们来复习一下如何建立一个存储器属性:java

var user = {
    name: ''
}
Object.defineProperty(user, 'nickname', {
    configurable: true,
    enumerable: true,
    get: function() {
        return this.name
    },
    set: function(value) {
        this.name = value
    }
})
复制代码

以上代码咱们给user建立了一个名为nickname的存储器属性。bash

接下来咱们改写getset,让它们与DOM绑定,并实现双向数据绑定,如下为具体实现的伪代码:post

<input type="text" id="foo">

<script>
    var user = {}
    Object.defineProperty(user, 'inputValue', {
        configurable: true,
        get: function() {
            return document.getElementById('foo').value
        },
        set: function(value) {
            document.getElementById('foo').value = value
        }
    })
</script>
复制代码

咱们打开控制台,改变user.inputValue的值,会发现input输入框里的值也发生变化;一样咱们在input输入框里面输入值,在控制台打印user.inputValue,会发现user.inputValue也发生了变化。这样咱们就实现了双向的数据绑定。ui

若是多个DOM绑定同一个数据,咱们能够监听input输入框的keyup事件,只要触发了keyup事件咱们就把user.inputValue的值赋给另外一个DOM,具体实现以下:this

<input type="text" id="foo">
<p id="test"></p>

<script>
    var user = {}
    Object.defineProperty(user, 'inputValue', {
        configurable: true,
        get: function() {
            return document.getElementById('foo').value
        },
        set: function(value) {
            document.getElementById('foo').value = value
            document.getElementById('test').innerHTML = value
        }
    })
    document.getElementById('foo').addEventListener('keyup',function() {
        document.getElementById('test').innerHTML = user.inputValue
    })
复制代码

最后附上源码图片 spa

思考:其实实现双向数据绑定并不必定要用Object.defineProperty(),其主要是运用存储器属性的get和set,如下代码也能够实现双向数据绑定:3d

<input type="text" id="foo">
<p id="test"></p>

<script>
    var user = {
      get inputValue() { 
        return document.getElementById('foo').value
      },
      set inputValue(value) {
        document.getElementById('foo').value = value
        document.getElementById('test').innerHTML = value
      }
    }
    document.getElementById('foo').addEventListener('keyup',function() {
      document.getElementById('test').innerHTML = user.inputValue
    })
</script>
复制代码
相关文章
相关标签/搜索