- 前言:最近在看vue數(shù)據(jù)雙向綁定的時候尤大神追蹤數(shù)據(jù)變化并通知相關(guān)“人員”纸颜,Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter。
待整理
<script type="text/javascript">
/*
Object.create(prototype[,descriptors])
創(chuàng)建一個對象,并把其prototype屬性賦值為第一個參數(shù),同時可以設(shè)置多個descriptors瘫俊。
*/
var Cat = Object.create({
"name": 'miaomiao',
'food': function() {
alert('I love fish');
}
});
console.log('貓實例', Cat);
console.log('================================================================');
/*
Object.defineProperty(obj, prop, descriptor)
1. value: 任何值济榨,默認(rèn)是undefined
2. writable: 是否可以被重寫坯沪,默認(rèn)是false
3. enumerable: 是否可以被循環(huán)(使用for...in或Object.keys()), 默認(rèn)是false
4. configurable: 是否可被刪除擒滑,是否可以再次設(shè)置特性
5. get: 返回property的值的方法腐晾,默認(rèn)是undefined
6. set: 為property設(shè)置值的方法,默認(rèn)是undefined
*/
var person = Object.create({})
Object.defineProperty(person ,'age', {
value: '24',
writable: true, //只讀
enumerable: true, //可被循環(huán)
configurable: true //可被刪除
});
Object.defineProperty(person, 'name', {
value: 'datura_lj',
writable: false, //可修改
enumerable: false, //不可被循環(huán)
configurable: false //不可被刪除
});
console.log('person', person);
person.age = 17;
person.name = 'shuaishuai';
console.log(person);
for (var key in person) {
console.log(key + ':' + person[key]);
}
delete person.age;
delete person.name;
console.log(person);
/*
Object.defineProperties(); 批量設(shè)置
*/
Object.defineProperties(person, {
'job': {
value: '搬磚的',
writable: true,
enumerable: true,
configurable: true
},
'sex': {
value: 'man',
writable: false,
enumerable: false,
configurable: false
}
});
console.log(person);
/*
Object.getOwnPropertyDescriptor(obj, property)
獲取defineProperty方法設(shè)置的property 特性(只讀丐一,刪除等)
*/
console.log(Object.getOwnPropertyDescriptor(person, 'job'));
/*
Object.getOwnPropertyNames(obj)
//獲取所有的屬性名藻糖,不包括prototy中的屬性,返回一個數(shù)組
*/
console.log(Object.getOwnPropertyNames(person));
/*
Object.keys(obj)
和getOwnPropertyNames方法類似库车,但是獲取所有的可以循環(huán)的屬性巨柒,返回一個數(shù)組
*/
console.log(Object.keys(person));
console.log('================================================================');
/*
Object.preventExtensions(obj) 鎖住對象屬性,使其不能夠拓展凝颇,也就是不能增加新的屬性潘拱,但是屬性的值仍然可以更改,也可以把屬性刪除
Object.isExtensible(obj) 用于判斷對象是否可以被拓展拧略,返回值為true/false
*/
console.log(Object.isExtensible(person)); //true 判斷對象是否可以被拓展
person.hobby = 'money';
console.log(person.hobby); //money ,此時對象可以拓展
Object.preventExtensions(person);
console.log(Object.isExtensible(person)); //false 判斷對象是否可以被拓展
person.hobby = "code";
console.log(person.hobby); //code芦岂,屬性值仍然可以修改
console.log(person.hobby); //undefined仍可刪除屬性
delete person.hobby;
console.log(person.hobby); //undefined仍可刪除屬性
person.like = 'woman'; //Can't add property firstname, object is not extensible 不能夠添加屬性
console.log(person.like);
console.log('================================================================');
/*
Object.seal(obj) 讓對象既不可以拓展也不可以刪除屬性(把每個屬性的configurable設(shè)為false),單數(shù)屬性值仍然可以修改;
Object.isSealed由于判斷對象是否被密封
*/
Object.seal(person);
person.name = '007'; //仍然可以修改
console.log(person.name)
delete person.name; //Cannot delete property 'age' of #<Object>
console.log(person.name)
console.log('================================================================');
/*
Object.freeze(obj) 完全凍結(jié)對象,在seal的基礎(chǔ)上垫蛆,屬性值也不可以修改(每個屬性的wirtable也被設(shè)為false)
*/
Object.freeze(person);
person.aaa = 25; //Cannot assign to read only property 'age' of #<Object>
console.log(person.aaa)
</script>
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者