作者:KeenWon
原文地址:http://keenwon.com/1524.html
Javascript中的繼承一直是個比較麻煩的問題乍钻,prototype
、constructor
育拨、__proto__
在構(gòu)造函數(shù),實例和原型之間有的復(fù)雜的關(guān)系怀挠,不仔細(xì)捋下很難記得牢固绿淋。ES6中又新增了class
和extends
尝盼,和ES5攪在一起,加上平時很少自己寫繼承,簡直亂成一鍋粥佩捞。不過還好一忱,畫個圖一下就清晰了帘营,下面不說話了,直接上圖庄新,上代碼择诈。
ES5
ES5中的繼承出皇,看圖:
function Super() {}
function Sub() {}
Sub.prototype = new Super();
Sub.prototype.constructor = Sub;
var sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.prototype.__proto__ == Super.prototype; // ⑦ true
ES5中這種最簡單的繼承,實質(zhì)上就是將子類的原型設(shè)置為父類的實例纱注。
ES6
ES6中的繼承狞贱,看圖:
class Super {}
class Sub extends Super {}
var sub = new Sub();
Sub.prototype.constructor === Sub; // ② true
sub.constructor === Sub; // ④ true
sub.__proto__ === Sub.prototype; // ⑤ true
Sub.__proto__ === Super; // ⑥ true
Sub.prototype.__proto__ === Super.prototype; // ⑦ true
所以ES6和ES5的繼承是一模一樣的蝎毡,只是多了class
和extends
沐兵,ES6的子類和父類扎谎,子類原型和父類原型毁靶,通過__proto__
連接解藻。