天天看點

ES6 - class的學習

http://es6.ruanyifeng.com/#docs/class

class Person {

constructor{

//構造函數,裡邊放不被繼承的私有屬性和方法

this.property1 = '第一個私有屬性';

//屬性結尾用分号

}

//不寫在constructor裡邊的屬性和方法都是寫在了prototype原型上:

Func1() {

Fun2() {

//多個方法之間不用逗号隔開,加了逗号反而是錯的

}

class PersonCild extends Person {

//extends實作繼承

報錯:

missing super() call in constructor ??//在構造函數中缺少super()調用

這個時候就是要在constructor裡邊單獨寫一行super();調用,

其他需要記憶的知識點:

類的資料類型就是函數,類本身就是函數

在類的執行個體上面調用方法,其實就是調用原型上的方法

類的原型上的constructor就是類本身

盡量不要用__proto__在執行個體對象上給類原型添加方法,應用object.getPrototypeOf

class表達式,給類命名,可以查找目前類:如下

const Myclass = class Me{

protoFun(){

return Me.name //Me

class沒有變量提升

let也沒有變量提升

類相當于執行個體的原型,所有在勒種定義的方法,都會被執行個體繼承

類(動态)方法内的this,預設執行類的執行個體

靜态方法中的this指的是類,動态方法中的this預設指的是執行個體

如果在一個方法前,加上static關鍵字,就表示該方法不會被執行個體繼承,而是直接通過類來調用,這就稱之為“靜态方法”,就是加上static後方法隻能用類的名字來調用,執行個體就調不找了

靜态方法可以與非靜态方法重名。

父類的靜态方法,可以被子類繼承。

子類 的靜态方法可以和父類的靜态方法重名,重名後在子類的靜态方法裡邊可以用super.方法名()調用父類的同名靜态方法

私有方法:隻能類内部使用,

利用Symbol的唯一性

const bar = Symbol('bar');

export default class myClass{

[bar](bar){

return '私有方法'

執行個體屬性: 定義在執行個體對象(this)上的屬性

靜态屬性: 定義在class本身的屬性

寫法:

class 類名{

this.屬性B = 屬性值;

};

類名.屬性A = 屬性值;

這裡,屬性A就是靜态屬性,定義在類的外部

class

constructor

new target 傳回new指令作用于的那個構造函數 var 執行個體 = new 函數A,則new target代表函數A

類名.name

get

set

static 靜态方法

super 代表父類的構造函數 傳回父類執行個體,子類必須在constructor方法中調用super方法,因為子類執行個體的建構,基于對父類執行個體的加工

obj.getPrototypeOf(zilei) === fulei;得到子類的父類

類的__proto__和prototype屬性

es5中,__proto__指向構造函數的prototype屬性

es6中:

子類的__proto__屬性,表示構造函數的繼承,總是指向父類

子類prototype屬性的__proto__屬性,表示方法的繼承,總是指向父類的prototype屬性

B.prototype.__proto__ = A.prototype;

B.__proto__ = A;

這兩條繼承鍊,可以這樣了解:

作為一個對象,子類(B)的原型(__proto__屬性)是父類(A);

作為一個構造函數,子類(B)的原型對象(prototype屬性)是父類的原型對象(prototype屬性)的執行個體。

執行個體的__proto__屬性

子類原型的原型,是父類的原型:子類執行個體.__proto__.__proto__ = 父類執行個體.__proto__

是以:

通過子類執行個體的__proto__.__proto__屬性,可以修改父類執行個體的行為。

原生構造函數:

是指js語言内置的構造函數,如下:

Boolean()

Number()

String()

Array()

Date()

Function()

RegExp()

Error()

Object()

繼續閱讀