對象(object)是 JavaScript 最重要的數據結構。ES6中對對象又有了重大的升級,下面我將從屬性、屬性名、super關鍵字這幾方面進行總結,方便理解記憶。
一、屬性的簡潔表示法
ES6 允許直接寫入變量和函數,作爲對象的屬性和方法。
// ES6 允許在對象之中,直接寫變量。
const name = 'wjx';
const names = {name};
console.log(names);//{name: "wjx"}
//等同於
const names1 = {name: name};
console.log(names1);//{name: "wjx"}
//又比如:
function f(x, y) {
return {x, y};
}
// 等同於
function f(x, y) {
return {x: x, y: y};
}
f(1, 2) // Object {x: 1, y: 2}
除了屬性簡寫,方法也可以簡寫
const o = {
method() {
return "Hello!";
}
};
// 等同於
const o = {
method: function() {
return "Hello!";
}
};
CommonJS 模塊輸出一組變量,就非常合適使用簡潔寫法。
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
};
二、屬性名表達式
JavaScript 定義對象的屬性,有兩種方法。一是直接用標識符作爲屬性名,方法二是用表達式作爲屬性名,這時要將表達式放在方括號之內。
什麼?你不清楚什麼是標識符?
在JavaScript中,標識符只能包含字母或數字或下劃線(“_”)或美元符號(“$”),且不能以數字開頭。標識符與字符串不同之處在於字符串是數據,而標識符是代碼的一部分。在
JavaScript 中,無法將標識符轉換爲字符串,但有時可以將字符串解析爲標識符。
// 方法一:標識符
obj.foo = true;
// 方法二:表達式
obj['a' + 'bc'] = 123;
ES6 允許字面量定義對象時,用方法二(表達式)作爲對象的屬性名,即把表達式放在方括號內。
let propKey = 'foo';
let obj = {
[propKey]: true,
['a' + 'bc']: 123
};
表達式還可以用於定義方法名。
let obj = {
['h' + 'ello']() {
return 'hi';
}
};
obj.hello() // hi
const keyA = {a: 1};
const keyB = {b: 2};
const myObject = {
[keyA]: 'valueA',
[keyB]: 'valueB'
};
myObject // Object {[object Object]: "valueB"}
上面代碼中,[keyA]和[keyB]得到的都是[object Object],所以[keyB]會把[keyA]覆蓋掉,而myObject最後只有一個[object Object]屬性。
三、super 關鍵字
我們知道,this關鍵字總是指向函數所在的當前對象,ES6 又新增了另一個類似的關鍵字super,指向當前對象的原型對象。
const proto = {
foo: 'hello'
};
const obj = {
foo: 'world',
find() {
return super.foo;
}
};
Object.setPrototypeOf(obj, proto);
obj.find() // "hello"
上面代碼中,對象obj.find()方法之中,通過super.foo引用了原型對象proto的foo屬性。注意,super關鍵字表示原型對象時,只能用在對象的方法之中,用在其他地方都會報錯。
const proto = {
x: 'hello',
foo() {
console.log(this.x);
},
};
const obj = {
x: 'world',
foo() {
super.foo();
}
}
Object.setPrototypeOf(obj, proto);
obj.foo() // "world"
上面代碼中,super.foo指向原型對象proto的foo方法,但是綁定的this卻還是當前對象obj,因此輸出的就是world。