1. 程式人生 > >JS中物件的進化史

JS中物件的進化史

  • 階段1
    人們習慣用字面量的形式定義物件:
var obj =  {
	name: 'zyp',
	age: 18,
	like: function() {
   	console.log('愛睡覺!')
   }
   /**  ES6寫法
   **	like() {
   **	console.log('愛睡覺!')
   **	}
}

這時如果人們想批量定義100個objs時(這些objs往往具有相同的屬性),不得不重複定義100遍obj,這樣不僅程式碼繁雜,因為每個物件都會在堆記憶體中佔用一定的空間,因此非常的浪費記憶體。

  • 階段2
    這時人們想到不是可以用函式的方式返回物件嗎?那麼我們就可以使用建構函式來返回物件吧。但是這個專門用來返回物件的函式為了能和其他的函式區分開來,一般用大寫字母開頭,同時我們可以把那些公用的屬性定義在原型鏈上,這樣這些共有屬性就存在同一塊記憶體中了,不是可以節省很多開銷了嗎?
function Obj(name, age) {
   var obj = {};
   obj.name = name;
   obj.age = age;
   obj.__proto__ = Obj.prototype
   return obj;
}
//假設大家的共同愛好是睡覺啊
Obj.prototype = {
   constructor: Obj,
   like: function() {   //當然這裡函式也可以採用ES6的方法定義
   	console.log('愛睡覺!') 
   }
}
  • 階段3
    這時出現了new關鍵字,這個關鍵字其實是一個語法糖,它幫我們將程式碼進行了簡化,這樣我們在定義建構函式時就可以這樣定義了:
function Obj(name, age) {
   this.name = name;
   this.age = age;
}
Obj.prototype = {
   constructor: Obj,
   like: function() {   //當然這裡函式也可以採用ES6的方法定義
   		console.log('愛睡覺!') 
   	}
}

我們可以看到,new關鍵字自動幫我們寫了以下程式碼:

	var obj = {};
	obj.__proto__ = Obj.prototype
   return obj;
  • 階段4
    ES6中直接用class的寫法代替了建構函式的寫法
class Obj {
   constructor(name, age) {
   	this.name = name;
   	this.age = age;
   }
   like() {
   	console.log('愛睡覺!') 
   }
}

這裡class其實也是一個語法糖,它也幫我們省略了

   constructor: Obj,