什么是静态方法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)
这样看着方便简洁了不少