美文网首页重学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