日常好奇 看看ES6的類如何實現的 二

2021-09-11 15:36:11 字數 2602 閱讀 5950

還是用這個繼承的例子:

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....