在ES5以前,讀/寫對象的屬性時倾哺,產生的結果就是返回了對象屬性的值/設置了對象屬性的值轧邪。
在ES5之后刽脖,對于用get/set方法定義的屬性來說,對它進行讀/寫屬性時忌愚,其結果卻是可以由開發(fā)者來自定義的曲管。即給了開發(fā)者自己去定義“讀/寫對象的屬性”這個兩種操作的具體行為的權利,使得靈活性大大提高硕糊。
例如:
var obj={
_name:"veb",
get name(){
console.log("你獲取了name的值")院水;
return this._name;
},
set name(a){
console.log("你設置了name的值為"+a);
return this._name=a;
},
}
console.log(obj.name)//你獲取了name的值
obj.name="len"http://你設置了name的值為len
聰明的你馬上就能想到vue的雙向綁定简十,這是為師對你的信任檬某!
對于get和set不過是一個es5提供的語法糖而已,為什么這么說螟蝙?
一個對象恢恼,如果在你修改或獲取屬性值之前想做一些事情該怎么辦呢?
var o = (function(){
var age = 0;
return {
get_age:function(){
console.log("你想知道我的年齡胰默?已經(jīng)給你return出去了")
return age;
},
set_age:function(v){
console.log("你要設置我的年齡為"+v)
age=v;
}
}
})();
o.get_age();//你想知道我的年齡场斑?已經(jīng)給你return出去了
o.set_age(12);//你要設置我的年齡為12
console.log(o.get_age());//你想知道我的年齡?已經(jīng)給你return出去了 12
現(xiàn)在明白了吧牵署?vue的數(shù)據(jù)檢測就是使用的es5 的get&set
不同于angular臟查詢機制,那么如何批量檢測呢漏隐?
Object.defineProperty(obj,key碟刺,valueObj)
其中obj代表要在哪個對象上設置屬性锁保,key為屬性名,valueObj為值對象配置半沽,相關可以參考es5數(shù)組及對象處理方法
基礎用法
var obj={};
Object.defineProperty(obj,'age', {
value: 18,
writable: true,
enumerable: true,
configurable: true
});
console.log(obj.age)//18爽柒;
//或者同時定義多個屬性:
Object.defineProperties(obj, {
'age': {
value: 24,
writable: true,
enumerable: true,
configurable: true
},
'sex': {
value: '男',
writable: false,
enumerable: false,
configurable: false
}
});
定義get&set
var obj={
_name:"veb"
};
Object.defineProperty(obj,"name", {
get: function() {
console.log("你獲取了name的值");
return this._name;
},
set: function(y) {
console.log("你設置了的值")
return this._name=y;
},
});
注意:key和要監(jiān)測的屬性名不能為同一個,不然同時使用get&set會出現(xiàn)死循環(huán)者填!
批量監(jiān)測:
function fun(obj){
var obj2={};
for(var i in obj){
this["_"+i]=obj[i];
}
console.log(this);
var self=this;
for(var x in this){
(function(x){
Object.defineProperty(self,x.replace("_",""), {
get: function() {
console.log("你獲取了"+x+"的值")
return self[x]
},
enumerable: true,
configurable: true,
set: function(y) {
console.log("你設置了"+x+"的值")
return self[x]=y;
},
});
})(x)
}
}
var person=new fun({
name:"veb",
age:"20"
})
console.log(person.name)//你獲取了name的值 veb
person.age=50//你設置了age的值
加油浩村!歡迎光臨個人站清風筆記