什麼是靜態方法es6
定在在類上,而不是定義在類的原型上,類能夠調用,類的實例不能調用的方法就叫作靜態方法this
看代碼spa
function Foo() { } //定義在Foo類上 Foo.static = function () { console.log('static fun') } //定義在Foo原型上 Foo.prototype.test = function () { console.log('test fun') } var fun = new Foo() fun.test() //實例能夠調用 Foo.static() //類能夠調用 fun.static() //實例不能夠調用
fun.static()會報錯prototype
以上的寫法是es6以前的老寫法,es6定義了class註冊類的方式,static關鍵字也成爲註冊靜態方法的方式code
看代碼對象
class Foo {
static classMethod (){
console.log('static fun')
}
//定義在原型上的方法
commonMethod (){
console.log('commonMethod')
}
}
Foo.classMethod() //類能夠調用
var foo = new Foo()
foo.commonMethod() //實例能夠調用
foo.classMethod() //實例不能夠調用
Foo.commonMethod() //類不能夠調用
es6只是換了一種聲明方式,道理是同樣的blog
static方法是能夠被繼承的繼承
class Foo { static classMethod (){ console.log('static fun') } } class Son extends Foo{ } Son.classMethod()//子類調用父類的靜態方法
還能夠用super調用原型
class Foo { static classMethod (){ console.log('static fun') } } class Son extends Foo{ static sonMethod(){ super.classMethod() } } Son.sonMethod() //super調用
靜態屬性io
靜態屬性指的是 Class 自己的屬性, 即Class.propname, 而不是定義在實例對象( this) 上的屬性。
class Foo {} Foo.prop = 1; console.log(Foo.prop) // 1
目前只支持這樣寫,由於es6規定只能在方法前面用static關鍵字
es7 提議了靜態屬性,而且如今獲得了Babel 轉碼器支持
class Foo { static prop=2 //靜態屬性 }
而且也對實例屬性的聲明方式作了簡化,es6在實例屬性必須在constructor中進行聲明
class Foo { static prop = 2 //靜態屬性 constructor(){ this.state ='name' //定義在實例上的屬性 } }
es7能夠直接在class中用等式聲明實例屬性
class Foo { static prop = 2 //靜態屬性 state ='name' //定義在實例上的屬性 //靜態方法 static classMethod (){ console.log('static fun') } //定義在原型上的方法 commonMethod (){ console.log('commonMethod') } } var foo = new Foo() console.log(foo.state)
這樣看着方便簡潔了不少