ES6 javascript中class靜態(tài)方法、屬性與實(shí)例屬性用法示例
本文實(shí)例講述了ES6 javascript中class靜態(tài)方法、屬性與實(shí)例屬性用法。分享給大家供大家參考,具體如下:
類(lèi)相當(dāng)于實(shí)例的原型, 所有在類(lèi)中定義的方法, 都會(huì)被實(shí)例繼承。 如果在一個(gè)方法前, 加上static關(guān)鍵字, 就表示該方法不會(huì)被實(shí)例繼承, 而是直接通過(guò)類(lèi)來(lái)調(diào)用, 這就稱(chēng)為“ 靜態(tài)方法”。
class Foo {
static classMethod() {
return 'hello';
}
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function
上面代碼中, Foo類(lèi)的classMethod方法前有static關(guān)鍵字, 表明該方法是一個(gè)靜態(tài)方法, 可以直接在Foo類(lèi)上調(diào)用( Foo.classMethod()), 而不是在Foo類(lèi)的實(shí)例上調(diào)用。 如果在實(shí)例上調(diào)用靜態(tài)方法, 會(huì)拋出一個(gè)錯(cuò)誤, 表示不存在該方法。
父類(lèi)的靜態(tài)方法, 可以被子類(lèi)繼承。
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {}
Bar.classMethod(); // 'hello'
上面代碼中, 父類(lèi)Foo有一個(gè)靜態(tài)方法, 子類(lèi)Bar可以調(diào)用這個(gè)方法。
靜態(tài)方法也是可以從super對(duì)象上調(diào)用的。
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {
static classMethod() {
return super.classMethod() + ', too';
}
}
Bar.classMethod();
靜態(tài)屬性
靜態(tài)屬性指的是 Class 本身的屬性, 即Class.propname, 而不是定義在實(shí)例對(duì)象( this) 上的屬性。
class Foo {}
Foo.prop = 1;
Foo.prop // 1
上面的寫(xiě)法為Foo類(lèi)定義了一個(gè)靜態(tài)屬性prop。
目前, 只有這種寫(xiě)法可行, 因?yàn)?ES6 明確規(guī)定, Class 內(nèi)部只有靜態(tài)方法, 沒(méi)有靜態(tài)屬性。
// 以下兩種寫(xiě)法都無(wú)效
class Foo {
// 寫(xiě)法一
prop: 2
// 寫(xiě)法二
static prop: 2
}
Foo.prop // undefined
ES7 有一個(gè)靜態(tài)屬性的提案, 目前 Babel 轉(zhuǎn)碼器支持。
這個(gè)提案對(duì)實(shí)例屬性和靜態(tài)屬性, 都規(guī)定了新的寫(xiě)法。
(1) 類(lèi)的實(shí)例屬性
類(lèi)的實(shí)例屬性可以用等式, 寫(xiě)入類(lèi)的定義之中。
class MyClass {
myProp = 42;
constructor() {
console.log(this.myProp); // 42
}
}
上面代碼中, myProp就是MyClass的實(shí)例屬性。 在MyClass的實(shí)例上, 可以讀取這個(gè)屬性。
以前, 我們定義實(shí)例屬性, 只能寫(xiě)在類(lèi)的constructor方法里面。
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
}
上面代碼中, 構(gòu)造方法constructor里面, 定義了this.state屬性。
有了新的寫(xiě)法以后, 可以不在constructor方法里面定義。
class ReactCounter extends React.Component {
state = {
count: 0
};
}
這種寫(xiě)法比以前更清晰。
為了可讀性的目的, 對(duì)于那些在constructor里面已經(jīng)定義的實(shí)例屬性, 新寫(xiě)法允許直接列出。
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
state;
}
(2) 類(lèi)的靜態(tài)屬性
類(lèi)的靜態(tài)屬性只要在上面的實(shí)例屬性寫(xiě)法前面, 加上static關(guān)鍵字就可以了。
class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myProp); // 42
}
}
同樣的, 這個(gè)新寫(xiě)法大大方便了靜態(tài)屬性的表達(dá)。
// 老寫(xiě)法
class Foo {}
Foo.prop = 1;
// 新寫(xiě)法
class Foo {
static prop = 1;
}
上面代碼中, 老寫(xiě)法的靜態(tài)屬性定義在類(lèi)的外部。 整個(gè)類(lèi)生成以后, 再生成靜態(tài)屬性。 這樣讓人很容易忽略這個(gè)靜態(tài)屬性, 也不符合相關(guān)代碼應(yīng)該放在一起的代碼組織原則。 另外, 新寫(xiě)法是顯式聲明( declarative), 而不是賦值處理, 語(yǔ)義更好。
更多相關(guān)內(nèi)容可查看本站專(zhuān)題:《ECMAScript6(ES6)入門(mén)教程》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript字符與字符串操作技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家基于ECMAScript的程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript中利用Array filter() 方法壓縮稀疏數(shù)組
Array filter() 方法會(huì)跳過(guò)稀疏數(shù)組中缺少的元素,它的返回?cái)?shù)組總是稠密的。這篇文章給大家介紹了JavaScript中利用Array filter() 方法壓縮稀疏數(shù)組的相關(guān)知識(shí),需要的朋友參考下2018-02-02
小程序多圖列表實(shí)現(xiàn)性能優(yōu)化的方法步驟
這篇文章主要介紹了小程序多圖列表實(shí)現(xiàn)性能優(yōu)化的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
重學(xué) JS:為啥 await 不能用在 forEach 中詳解
這篇文章主要介紹了重學(xué) JS:為啥 await 不能用在 forEach 中,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
詳解javascript腳本何時(shí)會(huì)被執(zhí)行
這篇文章主要介紹了詳解javascript腳本何時(shí)會(huì)被執(zhí)行,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2021-02-02
微信小程序中獲取用戶(hù)手機(jī)號(hào)授權(quán)登錄詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于微信小程序中獲取用戶(hù)手機(jī)號(hào)授權(quán)登錄的詳細(xì)步驟,在微信小程序中開(kāi)發(fā)者可以通過(guò)微信提供的API接口實(shí)現(xiàn)用戶(hù)登錄和獲取用戶(hù)的手機(jī)號(hào),需要的朋友可以參考下2023-07-07

