JS中物件的進化史
阿新 • • 發佈:2018-11-08
- 階段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,