還是用這個繼承的例子:
class
animal
getname()
}class
dogextends
animal
}複製**
我們babel一下,得到如下**:
"use strict";
var _createclass = function ()
} return
function (constructor, protoprops, staticprops) ;
}();
function
_possibleconstructorreturn(self, call)
return call && (typeof call === "object" || typeof call === "function") ? call : self;
}function
_inherits(subclass, superclass)
subclass.prototype = object.create(superclass && superclass.prototype,
});if (superclass) object.setprototypeof ? object.setprototypeof(subclass, superclass) : subclass.__proto__ = superclass;
}function
_classcallcheck(instance, constructor)
}var animal = function ()
_createclass(animal, [
}]);
return animal;
}();
var dog = function (_animal)
return dog;
}(animal);
複製**
animal
的**與上節非繼承的方式一致,直接跳過,來看下最後一部分dog
的**:
// 這還是乙個高階函式,與沒有繼承的物件相比,這裡多出了兩個函式_inherits和_possibleconstructorreturn
var dog = function (_animal)
return dog;
}(animal);
複製**
在來看_inherits
如何實現的:
// 繼承函式
function
_inherits(subclass, superclass)
// 將父函式構造器的prototype「拷貝」(使用原型鏈的方式並不是真正的賦值)乙份給子函式構造器的prototype
subclass.prototype = object.create(superclass && superclass.prototype,
});// 設定子函式構造器的原型為父函式構造器
if (superclass) object.setprototypeof ? object.setprototypeof(subclass, superclass) : subclass.__proto__ = superclass;
}複製**
這裡面涉及到了subclass.__proto__
和subclass.prototype
,那麼__proto__
和prototype
的區別是什麼?
實際上__proto__
是真正查詢時所用的物件,而prototype
是當你用new
關鍵在來構建物件時被用來建造__proto__
的,object.getprototypeof(dog) === dog.__proto__ === dog.prototype
。
函式__possibleconstructorreturn
處理了建構函式有返回值的情況。這種情況下,需要改變this
使用該返回值作為this
。
// 建構函式有返回值的情況
function
_possibleconstructorreturn(self, call)
return call && (typeof call === "object" || typeof call === "function") ? call : self;
}複製**
看了上面的實現,我們模擬這個步驟,為了簡化我們省去錯誤處理和特殊情況。
var animal = function(name)
animal.prototype.getname = function()
var dog = function(name)
dog.prototype = animal.prototype;
複製**
日常好奇 看看ES6的類如何實現的 一
為了真正理解es6中類的概念,來學習類是如何實現的 我們都知道在js中,函式是 一等公民 類 的概念是在es6中提出的,它好像跟我們自己寫的函式構造器一樣,但又有好像有些不一樣的地方,那麼它到底是如何實現的那?為了達到這個目的,我們利用babel來看下它編譯後的 首先我們寫乙個簡單的類,該類沒有任何...
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....