1、属性类型

Object属性分为两个类型:数据属性、访问器属性,每类属性又有其不同的特显,双向绑定的原理是根据其访问器属性的特性来实现的。

1.1数据属性的特性

数据属性有四个描述其行为的特性

1、Configurable:是否可以通过delete删除,能否修改他的属性特性,能否修改为访问器属性。默认值true

2、Enumerable:是否可以通过for in循环返回改属性

3、Writable:是否能修改属性值

4、Value:属性值

要就修改数据属性的默认特性,需要用Object.defineProperty()方法

var person = {}
Object.defineProperty(person,"name",{
writable:false;
value:'Nicholas';
})


1.2访问器属性特性

1、Configurable:是否可以删除

2、Enumerable:是否能够循环返回属性

3、Get:在读取属性的时候调用的函数。默认值是undefind

4、Set:在写入属性时调用的函数。

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

var book = {
_year:2014,
edition:1
};

Object.defineProperty(book,"year",{
get:function(){
return this._year
},
set:function(newValue){
if(newValue>2004){
this._year = newValue;
this.editon +=newValue -2004;
}
}
});

book.year = 2005;
alert(book.edition); //2


 

2、定义多个属性

var book = {};
Object.defineProperties(book,{
//数据属性
_year:{
writable:true,
value:2004
},
edition:{
writable:true,
value:1
},
//访问器属性
year:{
get:()=>{
return this._year;
},
set:(newValue)=>{
if(newValue>2004){
this._year = newValue;
this.edition += newValue -2004;
}
}
}
})


 

3、读取属性特性

var descriptor = Object.getOwnPropertyDescriptor(book,"year");
alert(descriptor.value); //undefind 访问属性没有value值
alert(descriptot.get); //funtion


4、模拟双向绑定

<div id="app">
<input type="text" id="txt">
<p id="show-txt"></p>
</div>
<script>
var obj = {}
Object.defineProperties(obj,{
_txt:{
writable:true,
value:'测试'
},
txt:{
get: function () {
return obj
},

set: function (newValue) {
document.getElementById('txt').value = newValue
document.getElementById('show-txt').innerhtml = newValue
}
}
})

document.addEventListener('keyup', function (e) {
obj.txt = e.target.value
});
console.log(bj.txt) //或者txt值
</script>