zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    java 分解质因数
    Unix 文件系统读写时权限校验
    find 命令实战巧用
    Linq分组功能
    三种查看SqlServer中数据物理pge页的方法
    一个高度压缩的bit位图字典的实现
    windbg 命令 gchandles
    ManualResetEvent和AutoResetEvent的区别实例
    一些汇编指令(基于8086)
    windbg sos版本不匹配问题解决
  • 原文地址:https://www.cnblogs.com/fqh123/p/12030770.html
Copyright © 2011-2022 走看看