ES6 javascript中class靜態(tài)方法、屬性與實(shí)例屬性用法示例
本文實(shí)例講述了ES6 javascript中class靜態(tài)方法、屬性與實(shí)例屬性用法。分享給大家供大家參考,具體如下:
類相當(dāng)于實(shí)例的原型, 所有在類中定義的方法, 都會被實(shí)例繼承。 如果在一個(gè)方法前, 加上static關(guān)鍵字, 就表示該方法不會被實(shí)例繼承, 而是直接通過類來調(diào)用, 這就稱為“ 靜態(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類的classMethod方法前有static關(guān)鍵字, 表明該方法是一個(gè)靜態(tài)方法, 可以直接在Foo類上調(diào)用( Foo.classMethod()), 而不是在Foo類的實(shí)例上調(diào)用。 如果在實(shí)例上調(diào)用靜態(tài)方法, 會拋出一個(gè)錯(cuò)誤, 表示不存在該方法。
父類的靜態(tài)方法, 可以被子類繼承。
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {}
Bar.classMethod(); // 'hello'
上面代碼中, 父類Foo有一個(gè)靜態(tài)方法, 子類Bar可以調(diào)用這個(gè)方法。
靜態(tài)方法也是可以從super對象上調(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í)例對象( this) 上的屬性。
class Foo {}
Foo.prop = 1;
Foo.prop // 1
上面的寫法為Foo類定義了一個(gè)靜態(tài)屬性prop。
目前, 只有這種寫法可行, 因?yàn)?ES6 明確規(guī)定, Class 內(nèi)部只有靜態(tài)方法, 沒有靜態(tài)屬性。
// 以下兩種寫法都無效
class Foo {
// 寫法一
prop: 2
// 寫法二
static prop: 2
}
Foo.prop // undefined
ES7 有一個(gè)靜態(tài)屬性的提案, 目前 Babel 轉(zhuǎn)碼器支持。
這個(gè)提案對實(shí)例屬性和靜態(tài)屬性, 都規(guī)定了新的寫法。
(1) 類的實(shí)例屬性
類的實(shí)例屬性可以用等式, 寫入類的定義之中。
class MyClass {
myProp = 42;
constructor() {
console.log(this.myProp); // 42
}
}
上面代碼中, myProp就是MyClass的實(shí)例屬性。 在MyClass的實(shí)例上, 可以讀取這個(gè)屬性。
以前, 我們定義實(shí)例屬性, 只能寫在類的constructor方法里面。
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
}
上面代碼中, 構(gòu)造方法constructor里面, 定義了this.state屬性。
有了新的寫法以后, 可以不在constructor方法里面定義。
class ReactCounter extends React.Component {
state = {
count: 0
};
}
這種寫法比以前更清晰。
為了可讀性的目的, 對于那些在constructor里面已經(jīng)定義的實(shí)例屬性, 新寫法允許直接列出。
class ReactCounter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
state;
}
(2) 類的靜態(tài)屬性
類的靜態(tài)屬性只要在上面的實(shí)例屬性寫法前面, 加上static關(guān)鍵字就可以了。
class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myProp); // 42
}
}
同樣的, 這個(gè)新寫法大大方便了靜態(tài)屬性的表達(dá)。
// 老寫法
class Foo {}
Foo.prop = 1;
// 新寫法
class Foo {
static prop = 1;
}
上面代碼中, 老寫法的靜態(tài)屬性定義在類的外部。 整個(gè)類生成以后, 再生成靜態(tài)屬性。 這樣讓人很容易忽略這個(gè)靜態(tài)屬性, 也不符合相關(guān)代碼應(yīng)該放在一起的代碼組織原則。 另外, 新寫法是顯式聲明( declarative), 而不是賦值處理, 語義更好。
更多相關(guān)內(nèi)容可查看本站專題:《ECMAScript6(ES6)入門教程》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript字符與字符串操作技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對大家基于ECMAScript的程序設(shè)計(jì)有所幫助。
相關(guān)文章
jquery中click等事件綁定及移除的幾種方法小結(jié)
這篇文章主要介紹了jquery中綁定事件與解綁事件是常用到的寫法,這里總結(jié)了幾種常見的綁定事件與解綁事件的方法,需要的朋友可以參考下2023-05-05
JS正則RegExp.test()使用注意事項(xiàng)(不具有重復(fù)性)
這篇文章主要介紹了JS正則RegExp.test()使用注意事項(xiàng),結(jié)合實(shí)例形式分析了RegExp.test()方法的功能與用法,以及針對不能重復(fù)調(diào)用的解決方法,需要的朋友可以參考下2016-12-12
基于Turn.js 實(shí)現(xiàn)翻書效果實(shí)例解析
最近項(xiàng)目經(jīng)理我個(gè)項(xiàng)目練練手,其項(xiàng)目需求是要實(shí)現(xiàn)翻書效果,看到這個(gè)需求后,我真是懵了,這咋整,我可是java出身的啊,這個(gè)問題真是難住我了,后來有同事的指導(dǎo),問題順利解決,下面小編把學(xué)習(xí)心得分享,感興趣的朋友可以參考下2016-06-06
微信小程序 行的刪除和增加操作實(shí)現(xiàn)詳解
這篇文章主要介紹了微信小程序 行的刪除和增加操作實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
BootStrap Validator 版本差異問題導(dǎo)致的submitHandler失效問題的解決方法
這篇文章主要介紹了BootStrap Validator 版本差異問題導(dǎo)致的submitHandler失效問題的解決方法,下面通過本文給大家詳細(xì)說明一下,需要的朋友可以參考下2016-12-12
微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決
這篇文章主要介紹了微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

