es6中class类的静态方法、实例方法、实例属性、(静态属性)

关于类有两个概念,1,类自身,;2,类的实例对象

总的来说:静态的是指向类自身,而不是指向实例对象,主要是归属不同,这是静态属性的核心

难点1:静态方法的理解

class Foo {
  static classMethod() {
    return 'hello';
  }
}

静态方法使用:在方法前加上static关键字

为什么使用静态方法:阻止方法被实例继承,类的内部相当于实例的原型,所有在类中直接定义的方法相当于在原型上定义方法,都会被类的实例继承,但是使用static静态方法定义的不会被实例继承,而且可以被实例直接应用Foo.classMethod(),此时写成new Foo.classMethod()会提示不存在此方法

静态方法中this指向:this指向类而不是类的实例

class Foo {
  static bar () {
    this.baz();
  }
  static baz () {
    console.log('hello');
  }
  baz () {
    console.log('world');
  }
}
 
Foo.bar() // hello

继承相关静态方法可以被子类继承,也可以被super调用      (要与实例区分开)

-----------------------------------------------------------------------------------------------------------------------

难点2:静态属性的理解,以及和实例属性的区别

理解了静态的本质就知道静态属性是class类自身的属性

相对的实例属性是指类的实例的属性,调用时使用 new Foo().'属性名'

定义实例属性的方法:2种

类的实例属性可以用等式,写入类的定义之中

1,在类中定义

class MyClass {
  myProp = 42;
 
  constructor() {
    console.log(this.myProp); // 42
  }
}
 
//上面代码中,myProp就是MyClass的实例属性。在MyClass的实例上,可以读取这个属性。

2,在constructor中定义(react中经典写法)

class ReactCounter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
}
 
//等价于
class ReactCounter extends React.Component {
  state = {
    count: 0
  };
}

定义静态属性

1,就和普通的Object添加属性一样,object.a = a;(目前唯一一种方法)

     缺点:老写法的静态属性定义在类的外部。整个类生成以后,再生成静态属性。容易忽略

2,静态属性的提案: 相对于实例方法定义,在定义实例方法的前面加上static关键字,该方法未发布

class MyClass {
  static myStaticProp = 42;
 
  constructor() {
    console.log(MyClass.myStaticProp); // 42
  }
}

 

下面练习个小例子

    class F{
           constructor(){//实例化时会被调用
               this.a="父类的实例属性";
               console.log(this);//指向类本身
           }
           static fun(){
               console.log("父类的静态方法");
               console.log(this);//执行类自身
               console.log(this.b);//"父类的静态属性"
           }
           fun2(){
                console.log(this);//指向实例
                console.log(this.a);
           }
       }
       F.b="父类的静态属性";//给F类加静态方法
       F.fun();
       var f=new F;
        //f.fun();//fun not a function
       f.fun2();

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-12 18:01  古墩古墩  Views(2659)  Comments(0Edit  收藏  举报