定義只有內(nèi)部才能使用的特性恼蓬,描述了屬性的各種特征蟆炊。是為實(shí)現(xiàn)JavaScript引擎用的。因此在JS中不能直接訪問(wèn)它們膜蛔。
1.數(shù)據(jù)屬性
-
[[Configurable]]
表示能否通過(guò)delete刪除屬性從而重新定義屬性坛猪,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性皂股。(不可配置) -
[[Enumerable]]
表示能否通過(guò)for-in循環(huán)返回屬性砚哆。 -
[[Writable]]
表示能否修改屬性的值。 -
[[Value]]
包含這個(gè)屬性的數(shù)據(jù)值屑墨。
要修改屬性默認(rèn)的特性躁锁,必須使用ECMAScript5的Object.defineProperty(屬性所在的對(duì)象,屬性的名字卵史,描述符對(duì)象)
方法战转。其中描述符對(duì)象
必須是configurable、enumerable以躯、writeable槐秧、value
啄踊。設(shè)置其中一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特性值刁标。
var person = {
name: 'Nichole'
};
Object.defineProperty(person, "name", {
writable: false, // 設(shè)置屬性不可修改
value: 'Bubble'
});
console.log(person.name); // Bubble
person.name = 'Hello';
// 非嚴(yán)格模式下颠通,該操作被忽略;嚴(yán)格模式下膀懈,會(huì)導(dǎo)致拋出錯(cuò)誤顿锰。
console.log(person.name); // Bubble
可以多次調(diào)用
Object.defineProperty()
修改同一屬性,但在把configurable
特性設(shè)置為false后就會(huì)有限制了启搂。
2.訪問(wèn)器屬性
訪問(wèn)器屬性不包含數(shù)據(jù)值硼控,它包含一對(duì)getter()
和setter()
函數(shù)。在讀取訪問(wèn)器屬性時(shí)胳赌,會(huì)調(diào)用getter()牢撼,這個(gè)函數(shù)負(fù)責(zé)返回有效的值。在寫(xiě)入訪問(wèn)器屬性時(shí)疑苫,會(huì)調(diào)用setter()并傳入新值熏版,這個(gè)函數(shù)負(fù)責(zé)如何處理數(shù)據(jù)。訪問(wèn)器屬性有如下特性:
[[Configurable]]
[[Enumerable]]
-
[[Get]]
在讀取屬性時(shí)調(diào)用的函數(shù)捍掺,默認(rèn)值為undefined -
[[Set]]
在寫(xiě)入屬性時(shí)調(diào)用的函數(shù)撼短,默認(rèn)值為undefined
訪問(wèn)器屬性不能直接定義,必須使用Object.defineProperty()
來(lái)定義乡小。
var person = {
_name: 'Nichole',
count: 0
};
Object.defineProperty(person, 'name', {
get: function () {
return this._name;
},
set: function (newValue) {
this._name = newValue;
this.count += 1;
}
});
person.name = 'Bubble';
console.log(person._name) // Bubble
console.log(person.count) // 1
person對(duì)象有兩個(gè)默認(rèn)屬性:_name
和count
。而訪問(wèn)器屬性name
則包含一個(gè)getter()和一個(gè)setter()饵史。
使用訪問(wèn)器屬性的常見(jiàn)方式即:設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化满钟。
- 如果只指定
getter
意味著屬性不能寫(xiě); - 如果只指定
setter
意味著屬性不能讀胳喷。
之前的瀏覽器不支持的使用湃番,使用的是__defineGetter__
和__defineSetter__
。
定義多個(gè)屬性:
var person = {
_name: 'Nichole',
count: 0
};
Object.defineProperties(person, {
_name: {
writable: true,
value: 'Bubble'
},
count: {
writable: true,
value: 12
},
name: {
get: function () {
return this._name;
},
set: function (newValue) {
this._name = newValue;
this.count++;
}
}
}
);
person.name = 'HAH';
console.log(person._name) // HAH
console.log(person.count) // 13
3.讀取屬性的特性
Object.getOwnPropertyDescriptor(person, '_name').configurable
4.擴(kuò)展思考:
Vue動(dòng)態(tài)數(shù)據(jù)綁定如何實(shí)現(xiàn)吭露?