美文网首页重学es6
class讲解之小结 实例方法和属性、静态方法和属性、私有方法和

class讲解之小结 实例方法和属性、静态方法和属性、私有方法和

作者: zhang463291046 | 来源:发表于2020-08-10 10:00 被阅读0次

    以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途

    class中,写法如下

    class Foo {
      a = 1  // 实例属性
      static b = 2  // 静态属性
      #c = 3  // 私有属性
      baz() {  // 实例方法
        
      }
      static bar() { // 静态方法
        
      }
      #bac() { // 私有方法
       
      }
    }
    
    // 等同
    function Foo(){
      this.a = 1;
      var c = 3;
      function bac(){
    
      }
    }
    Foo.b = 2;
    Foo.bar = function(){}
    Foo.prototype.baz = function(){}
    

    图解


    image.png

    实例方法的调用规则:

    • 实例化的对象,可以直接调用实例方法和属性
    • 在方法内部用this调用实例方法和属性,用类Foo调用静态方法和属性(注意不能使用this
    class Foo {
      a = 1  // 实例属性
      static b = 2  // 静态属性
      #c = 3  // 私有属性
      baz() {  // 实例方法
        console.log(this.a)
        console.log(Foo.b)
        this.baz2()
        Foo.bar()
      }
      baz2() {
        console.log('world')
      }
      static bar() { // 静态方法
        
      }
      #bac() { // 私有方法
       
      }
    }
    var f = new Foo();
    f.a; // 1
    f.baz2() //world
    

    静态方法的调用规则

    • 无需实例化对象,实例化的对象不能调用对象的静态方法和属性
    • 在方法内部用类Foo调用静态方法和属性,静态方法中this指类Foo
    • 不能调用实例方法和属性,不能调用私有方法和属性
    class Foo {
      a = 1  // 实例属性
      static b = 2  // 静态属性
      #c = 3  // 私有属性
      baz() {  // 实例方法
       
      }
      static bar() { // 静态方法
        console.log(Foo.b)  //2
        Foo.bar2()   //world
        console.log(this.a)  // 错误,this指Foo
        console.log(this.#c) // 错误
        this.baz()  // 错误
        this.#bac()  // 错误
      }
      static bar2() {
        console.log('world')
      }
      #bac() { // 私有方法
       
      }
    }
    var f = new Foo();
    Foo.b; // 2
    Foo.bar2(); //world
    f.b //错误
    f.bar2() //错误
    

    私有方法的调用规则

    • 无需实例化对象,实例化的对象不能调用对象的私有方法和属性,不能在类的外部被调用
    • 在方法内部用类Foo调用私有方法和属性,使用this时需要特别注意此时的this指向什么
    • 不能调用实例方法和属性,只有当this指向创建的实例时(将实例作为参数传入Foo.#bac(new Foo())),才能调用
    class Foo {
      a = 1  // 实例属性
      static b = 2  // 静态属性
      #c = 3  // 私有属性
      baz() {  // 实例方法
       
      }
      static bar() { // 静态方法
        
      }
      #bac() { // 私有方法
         console.log(Foo.#c) ; //3
         Foo.#bac2(); //world
        console.log(this.a)  // 错误,this指Foo
        console.log(Foo.b) // 2
        console.log(this.b) // 2,此时this指Foo
        this.baz()  // 错误
        Foo.bar()  
      }
      #bac2() { // 私有方法
         console.log('world')
      }
    }
    var f = new Foo();
    Foo.#c(); // 错误
    Foo.#bac() // 错误
    f.#c;// 错误
    f.#bac();// 错误
    

    除此之外,还有一种特殊的特权方法在类class上未进行实现,特权方法的调用规则:

    • 通过this调用实例方法和属性
    • 通过类Foo本身调用静态方法和属性
    • 在方法体内直接调用私有属性和私有方法
    function Foo(){
      this.a = 1;
      var c = 3;
      function bac() {
        console.log('3')
      }
      this.bad = function(){ // 特权方法
        console.log(this.a);  //1
        console.log(Foo.b);  //2
        console.log(c);  //3
        this.baz(); //1
        Foo.bar(); //2
        bac(); //3
      }
    }
    Foo.b = 2;
    Foo.bar = function(){
      console.log('2')
    }
    Foo.prototype.baz = function(){
      console.log('1')
    }
    var f = new Foo();
    f.bad ()
    

    相关文章

      网友评论

        本文标题:class讲解之小结 实例方法和属性、静态方法和属性、私有方法和

        本文链接:https://www.haomeiwen.com/subject/xspnrktx.html