為了真正理解es6中類的概念,來學習類是如何實現的我們都知道在js中,函式是「一等公民」,「類」的概念是在es6中提出的,它好像跟我們自己寫的函式構造器一樣,但又有好像有些不一樣的地方,那麼它到底是如何實現的那?為了達到這個目的,我們利用babel來看下它編譯後的**。
首先我們寫乙個簡單的類,該類沒有任何繼承,只有乙個簡單的建構函式和getname
函式
class
getname()
}複製**
然後babel一下,我們得到以下結果:
"use strict";
var _createclass = function ()
} return
function (constructor, protoprops, staticprops) ;
}();
function
_classcallcheck(instance, constructor)
} function
this.name = name;
} key: "getname",
value: function
getname()
}]);
}();
複製**
東西還挺多,一眼並看不出來什麼東西來,我們接下來一點點分析。我們先看最後乙個函式:
// 立即執行函式
// 建構函式變形成這樣
function
// 從這個函式的名字上看,好像是類呼叫檢查,我們暫時先不看這個函式
this.name = name;
} key: "getname",
value: function
getname()
}]);
}();
複製**
下面來看_createclass
函式,該函式用來定義各個屬性值:
// 從返回值看,該函式是乙個高階函式
var _createclass = function ()
} // 函式接收三個引數,分別是:建構函式,原型屬性,靜態屬性
return
function (constructor, protoprops, staticprops) ;
}();
複製**
好像很簡單,跟我們平時使用函式實現差別不是很多,就相差了乙個描述符的設定過程。最後看一下類呼叫檢查函式_classcallcheck
:
// 類呼叫檢查,不能像普通函式一樣呼叫,需要使用new關鍵字
function
_classcallcheck(instance, constructor)
}複製**
增加了錯誤處理,當我們呼叫方式不正確時,丟擲錯誤。
我們簡單實現以下沒有繼承的方式,來加深我們的印象,為了簡化不新增錯誤處理和描述符的設定過程。
this.name = name;
} return
this.name;
}複製**
下面想乙個問題,實現繼承我們一般都是利用原型鏈的方式,像下面這樣:
var dog = ;
var animal =
}// 物件的原型通過`__proto__`暴露出來(tip: 實際中不要這麼寫)
dog.__proto__ = animal;
console.log(dog.getname()); // 輸出goudan
複製**
我們如何在兩個類之間繼承那?在es6中實現很簡單
class
animal
getname()
}class
dogextends
animal
}複製**
如果我們自己實現乙個要怎麼實現,我們先寫乙個:
var animal = function(name)
animal.prototype.getname = function()
var dog = function(name)
dog.prototype = animal.prototype;
var dog = new dog('goudan');
console.log(dog.getname()); // 輸出goudan
複製**
日常好奇 看看ES6的類如何實現的 二
還是用這個繼承的例子 class animal getname class dogextends animal 複製 我們babel一下,得到如下 use strict var createclass function return function constructor,protoprops,s...
ES6 類的實現原理
一段符合es6語法的 class a render class b extends a render 我在babel官網上輸入,檢視轉碼 長很多,從中找出關鍵點 宣告classclass a 檢視對應轉碼var a function 可以看出宣告乙個class就是通過建立並執行乙個匿名函式,在這個匿...
es6 類的繼承
function animal name animal.prototype.drink function animal.prototype.eat function item function dog name,breed animal.prototype dog.prototype animal....