前面咱们介绍过存储器属性(从新认识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
接下来咱们改写get
和set
,让它们与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>
复制代码