先舉個(gè)栗子(~ ̄▽ ̄)~
在js中為一個(gè)對象添加屬性我們可以這樣
var Person = {};
Person.name = 'zane';
// 等價(jià)于
var Person = {
name = 'zane'
}
javascript對象的屬性可以分為兩類:
(1)數(shù)據(jù)屬性:包含一個(gè)數(shù)據(jù)值得位置知举,在這個(gè)位置可以讀取和寫入值派敷。有4個(gè)特性:
configrable: true/false; //能否通過delete刪除
enumerable: true/false; //能否通過for-in返回
writable: true/false; //能否修改
value:值
(2)訪問器屬性:訪問器屬性不包含值得位置照棋,而是包含一對getter夏块、setter函數(shù)剪芥,取值和賦值是通過這對函數(shù)操作担扑。同樣有四個(gè)特性:
configrable: true/false; //能否通過delete刪除
enumerable: true/false; //能否通過for-in返回
get //讀取屬性時(shí)調(diào)用函數(shù) 默認(rèn)值:undefined
set //寫入屬性時(shí)調(diào)用函數(shù) 默認(rèn)值:undefined
configrable/
可以看出上面例子中Person的name屬性是直接賦值的,所以是數(shù)據(jù)屬性,
數(shù)據(jù)屬性可以直接定義,而訪問器屬性不能直接定義芙扎。
接下來說明一下在JavaScript中如何使用上面說的幾種特性
Object.defineProperty(obj, 'property', {})
/* 數(shù)據(jù)屬性*/
var Person = {};
Object.defineProperty(Person, 'name', {
configurable: false,
writable: false,
enumerable: true,
value: 'Zane'
});
console.log("原name: "+Person.name); // 原name: Zane
Person.name = "xiaoming";
console.log("更改后name: "+Person.name); // 更改后name: Zane
delete Person.name;
console.log("刪除后name: "+Person.name); // 刪除后name: Zane
for(var key in Person) {
console.log(key);
}
// name
/* 訪問器屬性 */
var Book = {
_year: 2014,
edition: 1
}
Object.defineProperty(Book, 'year', {
get: function () {
return this._year;
},
set: function (value) {
if(value > 2014) {
this._year = value;
this.edition = value - 2014 + 1;
}
}
})
Book.year = 2016;
console.log(Book); // Object {_year: 2016, edition: 3}
如何同時(shí)定義多個(gè)屬性呢
var Book = {};
Object.defineProperties(Book, { // 注意是復(fù)數(shù) defineProperties
_year: {
value: 2014
},
edition: {
writable: true,
value: 1
},
year: {
get: function () {
return this._year;
},
set: function (value) {
if(value > 2014) {
this._year = value;
this.edition = value - 2014 + 1;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(Book, '_year');
console.log(descriptor.writable); // fales