對(duì)象的擴(kuò)展
1.屬性的簡(jiǎn)潔表示法
ES6 允許直接寫入變量和函數(shù),作為對(duì)象的屬性和方法。這樣的書寫更加簡(jiǎn)潔。
const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}
// 等同于
const baz = {foo: foo};
上面代碼表明,ES6 允許在對(duì)象之中,直接寫變量。這時(shí),屬性名為變量名, 屬性值為變量的值。下面是另一個(gè)例子。
function f(x, y) {
return {x, y};
}
// 等同于
function f(x, y) {
return {x: x, y: y};
}
f(1, 2) // Object {x: 1, y: 2}
除了屬性簡(jiǎn)寫,方法也可以簡(jiǎn)寫。
const o = {
method() {
return "Hello!";
}
};
// 等同于
const o = {
method: function() {
return "Hello!";
}
};
CommonJS 模塊輸出一組變量,就非常合適使用簡(jiǎn)潔寫法。
let ms = {};
function getItem (key) {
return key in ms ? ms[key] : null;
}
function setItem (key, value) {
ms[key] = value;
}
function clear () {
ms = {};
}
module.exports = { getItem, setItem, clear };
// 等同于
module.exports = {
getItem: getItem,
setItem: setItem,
clear: clear
};
2.屬性名表達(dá)式
JavaScript 定義對(duì)象的屬性,有兩種方法。
// 方法一
obj.foo = true;
// 方法二
obj['a' + 'bc'] = 123;
表達(dá)式還可以用于定義方法名。
let obj = {
['h' + 'ello']() {
return 'hi';
}
};
obj.hello() // hi
3.方法的 name 屬性
函數(shù)的name屬性,返回函數(shù)名。對(duì)象方法也是函數(shù),因此也有name屬性。
const person = {
sayName() {
console.log('hello!');
},
};
person.sayName.name // "sayName"
const key1 = Symbol('description');
const key2 = Symbol();
let obj = {
[key1]() {},
[key2]() {},
};
obj[key1].name // "[description]"
obj[key2].name // ""
上面代碼中,key1對(duì)應(yīng)的 Symbol 值有描述,key2沒有。
4.屬性的可枚舉性和遍歷
可枚舉行
對(duì)象的每個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor),用來控制該屬性的行為。Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述對(duì)象。
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
for...in循環(huán):只遍歷對(duì)象自身的和繼承的可枚舉的屬性。
Object.keys():返回對(duì)象自身的所有可枚舉的屬性的鍵名。
JSON.stringify():只串行化對(duì)象自身的可枚舉的屬性。
Object.assign(): 忽略enumerable為false的屬性,只拷貝對(duì)象自身的可枚舉的屬性。
Object.defineProperty()
語(yǔ)法節(jié)
Object.defineProperty(obj, prop, descriptor)
obj
要在其上定義屬性的對(duì)象。
prop
要定義或修改的屬性的名稱。
descriptor
將被定義或修改的屬性描述符。
返回值節(jié)
被傳遞給函數(shù)的對(duì)象。
在ES6中,由于 Symbol類型的特殊性,用Symbol類型的值來做對(duì)象的key與常規(guī)的定義或修改不同,而Object.defineProperty 是定義key為Symbol的屬性的方法之一。
描述節(jié)
該方法允許精確添加或修改對(duì)象的屬性。通過賦值操作添加的普通屬性是可枚舉的,能夠在屬性枚舉期間呈現(xiàn)出來(for...in 或 Object.key)