class

作者: 张凯斯 | 来源:发表于2018-09-12 11:05 被阅读0次
//类的定义
class Animal {
    //构造函数
    constructor(name,age) {
        console.log("父构造函数")
        this.name = name||"无";
     }
    //实例方法
     sayName() {
        console.log('My name is '+this.name);
     }
}

//类的继承
class Programmer extends Animal {
    constructor(name) {
        console.log("子构造函数")
        //ES6 要求,子类的构造函数必须执行一次super函数。在这里相当于Animal.prototype.constructor.call(this)。
        super(name) 
    }
    program() {
        console.log("I'm coding...");
    }
}

//测试我们的类
var animal=new Animal('dummy',2)
console.log("---------")
var programmer=new Programmer("zks")
console.log("---------")
programmer.sayName()

验证super内部this指向:
在super()执行时,它指向的是子类B的构造函数,而不是父类A的构造函数。也就是说,super()内部的this指向的是B。

class A {
    constructor() {
        console.log(new.target.name); //new.target指向当前正在执行的函数
    }
}
class B extends A {
    constructor() {
        console.log('-------')
        super();
    }
}
new A() // A
new B() // B

super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x的时候,读的是A.prototype.x,所以返回undefined。

class A {
 constructor() {
  this.x = 1;
 }
}
class B extends A {
 constructor() {
  super();
  this.x = 2;
  super.x = 3;
  console.log(super.x); // undefined
  console.log(this.x); // 3
 }
}
let b = new B();
class A {
    constructor() {
        this.x = 1;
    }
    s() {
        console.log(this.x);
    }
}
class B extends A {
    constructor() {
      super();
      this.x = 2;
    }
    m() {
        super.s();
    }
}
let b = new B();
b.m() // 2
class A {
 constructor() {
  this.x = 1;
 }
}
class B extends A {
 constructor() {
  super();
  this.x = 2;
  super.x = 3;
  console.log(super.x); // undefined
  console.log(this.x); // 3
 }
}
let b = new B();

相关文章

网友评论

      本文标题:class

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