對象的擴展

  對象(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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章