2020-11-12 ES6中的Class(类)


方法

在类中可以直接定义方法,实际上类的所有方法都定义在类的prototype属性上面。在类的 实例上面调用方法,其实就是调用原型上的方法

class Point { 
	constructor() { // ... } 
	toString() { // ... } 
	toValue() { // ... } 
}

由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上 面。Object.assign方法可以很方便地一次向类添加多个方法。

class Point { 
	constructor(){ // ... } 
}
Object.assign(Point.prototype, { 
	toString(){}, 
	toValue(){} 
});

每一个类都需要constructor方法,如果没写,会被自动添加。
实例方法,相当于写在了原型上,通过实例进行调用。
静态方法,拥有static关键字,静态方法只能由类本身进行调用,不会被实例继承,如果静态方法包含this关键字,这个this指的是类,而不是实例。
静态属性,只能由类本身进行访问,Animal.test = 'hello’是添加静态属性的唯一途径。
实例属性,可以定义在构造函数中。

class Animal{
    //每个类中都需要有,如果没有,会自动添加
    constructor(name){
        this.name = name
    }
    //实例方法
    //就是在Animal的原型中
    sayName(){
        console.log('111')
    }
    //静态方法
    //类本身可以调用,实例不能调用
    static say(){
        console.log('静态方法')
    }
}
//创建实例对象
//使用class声明的类在构建实例时必须通过new关键字
let dog = new Animal('张三')
// dog.sayName()   //111
// dog.say()   //报错,dog.say() is not a function
Animal.say()    //静态方法
console.log(dog)    //Animal { name: '张三' }
//静态属性
//只能由类本身进行调用
Animal.test = 'hello'
console.log(dog.test)   //undefined
console.log(Animal.test)    //hello

继承

通过extends关键字实现继承
子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。子类构造函数可以省略。在子类的构造函数中,只有调用 super之后,才可以使用this关键字,否则会报错。

class Animal{
    constructor(name){
        this.name = name
    }
    sayAnimal(){
        console.log('sayAnimal')
    }
    static sayHello(){
        console.log('这是Animal的静态方法')
    }
}
//继承Animal
//extends关键字
class Dog extends Animal{
    constructor(name,age){
        //name继承自父类
        //super
        super(name)
        this.age = age
    }
    //实例方法
    sayDog(){
        super.sayAnimal()
    }
    //静态方法
    static sayHi(){
        super.sayHello()
    }
}
let dog = new Dog('terry',18)
console.log(dog instanceof Dog) //true
console.log(dog instanceof Animal)  //true
dog.sayAnimal()     //sayAnimal
dog.sayDog()    //sayAnimal
// dog.sayHello()  //报错
// dog.sayHi()     //报错
Dog.sayHi()     //这是Animal的静态方法
Dog.sayHello()  //这是Animal的静态方法

super关键字

super这个关键字,既可以当作函数使用,也可以当作对象使用。

  • 函数
    子类B的构造函数之中的super(),代表调用父类的构造函数。
    super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这 里相当于A.prototype.constructor.call(this)。
  • 对象
    在普通方法中,指向父类的原型对象;在静态方法中,指向父类。由于super指向父类的原型对象,所以定义在父类实例上的方法或属性,是无法通过super调用的。

ES6 规定,通过super调用父类的方法时,super会绑定子类的this。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值