理解對(duì)象
ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性
數(shù)據(jù)屬性
示例1:
Nodejs 中
console.log(global.undefined);//undefined
global.undefined = 1;
console.log(global.undefined);//undefined
瀏覽器中
console.log(window.undefined);//undefined
window.undefined = 2;
console.log(global.undefined);//undefined
在js中一切皆對(duì)象,我們都知道全局屬性u(píng)ndefined的值為undefined.那么屬性就應(yīng)該是可以修改,上邊對(duì)全局屬性u(píng)ndefined進(jìn)行修改卻沒有修改成功碑定,這是為什么呢?
示例2:
Nodejs 中
var des = Object.getOwnPropertyDescriptor(global,'undefined');
console.log(des);
輸出
{
value: undefined,
writable: false,
enumerable: false,
configurable: false
}
在瀏覽器中輸出也應(yīng)該一樣.上面可以看到有四個(gè)屬性,這就是javascript中的屬性特性,它能設(shè)置屬性的值,可編輯,可刪除,可迭代特性。
- Configurable
表示能夠通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性直撤。默認(rèn)值true哎榴。表示能否刪除,如果是false,delete不起作用寝杖。在嚴(yán)格模式下報(bào)異常
- Enumerable
表示能否通過for-in 循環(huán)返回屬性违施。默認(rèn)值true。false不可迭代
- Writable
表示能否修改屬性的值,默認(rèn)是true朝墩。false不可修改
- Value
包含這個(gè)屬性的數(shù)據(jù)值,讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性的時(shí)候把新值保存在這個(gè)位置,默認(rèn)是undefined
要修改屬性默認(rèn)的特性,必須用ECMAScript5的Object.defineProperty(),接受三個(gè)參數(shù),屬性所在對(duì)象,屬性名稱,一個(gè)描述符對(duì)象醉拓。
示例3:
var obj = {};
Object.defineProperty(obj,'name',{
'value' : 'name',
'writable' : false
});
console.log(obj.name);//name
obj.name = 'newname';
console.log(obj.name);//name
訪問器屬性
示例4:
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function () {
return this._year;
},
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
console.log(book.edition);//2
訪問器屬性不包含數(shù)據(jù)值,它們包含一對(duì)getter和setter函數(shù),(不過這兩個(gè)函數(shù)都不是必須的)伟姐,默認(rèn)都是undefined.一般情況不用去定義setter和getter方法.找了很久也不知道在哪種場(chǎng)景適合用收苏。上面這一種就是給一個(gè)屬性賦值,導(dǎo)致另外一個(gè)屬性變化,其實(shí)在代碼中直接實(shí)現(xiàn)就可以.
上面代碼需要注意的地方是,year用_year代替.前面加下劃線是常用的用法,表示只能用對(duì)象方法訪問的屬性.如果用year回導(dǎo)致死循環(huán)賦值.
其他
另外還有 Object.definePropties可以批量為屬性設(shè)置特性