深入理解class

2022-07-25 03:24:07 字數 2415 閱讀 7793

一, class和自定義型別的區別:

1,類宣告不會被提公升。

2,類宣告的**自動執行在嚴格模式。

3,類的所有方法都是不可列舉的,而自定的方法必須使用object.defineproperty來設定。

4,類的所有方法都沒有[[construct]],因此用new來呼叫會報錯。

5,呼叫類構造器不使用new 會報錯。

6,檢視在類的內部重寫類名會報錯。

二,類的生成器方法

可以使用 symbol.iterator來定義生成器方法,來生成類的預設迭代器。

class iterator

*[symbol.iterator]()

} let iter = new

iterator();

for(let i of iter)

這樣每個例項就都可以使用for of來使用。 

三, 靜態成員

class中的靜態方法 是直接在方法前加上static關鍵字。  

靜態屬性的寫法:

class foo{}

foo.a = 1;

console.log(foo.a);

四,繼承

使用extends關鍵字進行繼承。 

只要乙個表示式能夠返回乙個具有[[construct]]屬性以及原型的函式,就可以對其使用extends。

function animal(name)

animal.prototype.getname = function();

class sheep extends animal

}let sheep = new sheep('yz');

sheep.getname();

上面的animal是es5的構造器,但也滿足上面的要求,因此可以直接使用extends被繼承。

由於extends後可以接受任意的表示式,那麼自然而然也可以建立混入:

const mixin1 =

}const mixin2 =

}function

mixin (...mixinobj);

object.assigin(base.prototype, ...mixinobj);

return

base;

}class minxinall extends mixin(mixin1, mixin2)

}

這樣所有minxinall的例項都可以使用 混入物件的方法。  若多個混入的物件有相同的屬性, 則只有最後被新增的屬性會被保留。

使用extends的子類, 也可以繼承父類的靜態成員。

五,super

super只能在子類中使用,如果在沒有extends的類中使用會報錯。

在構造器中,必須在訪問this之前呼叫super();因為super是用來初始化this的。

子類中可以使用super.方法()來訪問原型的方法。

當然,箭頭函式無super。

由於super是用來生成this的, 如果你只是想繼承原型,而對父類的構造器沒興趣, 可以在constructor中不使用super,返回乙個物件即可。

class a 

}class b extends a

gettwo()

}let n = new

b();

n.getone();

n.gettwo();

六,繼承內建物件與symbol.species屬性

繼承內建物件的 子類, 呼叫內建物件的方法,返回的結果是子類的例項。

比如:

class myarray extends array{}

let arr = new myarray(1,2,3,4,5);

let newarr = arr.slice(1, 4);

//按理來說 呼叫了slice之後,生成的應該是陣列,結果返回的newarr卻是 myarray的例項

symbol.species 知名符號被用於 定義乙個能返回函式的靜態訪問器屬性。一般預設擁有symbol.species屬性的型別預設返回的都是this,即自身的構造器。

子類繼承的時候,可以重寫 symbol.species屬性來指定生成的例項屬於何種型別。

七, new.target

在簡單的情況下, new.target就等於本類的建構函式。  這樣的話,可以通過使用new.target來建立乙個抽象基類。  即只能被繼承,自身不能例項化的類。

class animal 

}}class row extends animal

}let r = new row('yz'); //

正常let a = new animal(); //

丟擲錯誤。

深入理解Objective c中 class的含義

原文 來自 在objective c中,當乙個類需要引用另乙個類,即建立復合關係的時候,需要在類的標頭檔案中建立被引用類的指標。如 car.h 實現類我們先省略,如果你直接這麼編譯,編譯器會報錯,告訴你它不知道tire和engine是什麼。這時候有兩個選擇,乙個是import這兩個被引用類的標頭檔案...

深入理解Objective c中 class的含義

在objective c中,當乙個類需要引用另乙個類,即建立復合關係的時候,需要在類的標頭檔案中建立被引用類的指標。如 car.h 實現類我們先省略,如果你直接這麼編譯,編譯器會報錯,告訴你它不知道tire和engine是什麼。這時候有兩個選擇,乙個是import這兩個被引用類的標頭檔案,另乙個是使...

深入理解Objective c中 class的含義

在objective c中,當乙個類需要引用另乙個類,即建立復合關係的時候,需要在類的標頭檔案中建立被引用類的指標。如 car.h import inte ce car 實現類我們先省略,如果你直接這麼編譯,編譯器會報錯,告訴你它不知道tire和engine是什麼。這時候有兩個選擇,乙個是impor...