es6之class继承

163 阅读2分钟

ES6通过class关键字定义类

class User{
    constructor(name){  //构造方法,通过new命令生成对象实例时,自动调用该方法
        this.name = name
    }
    Hi(){
        console.log('Hi'+this.name)
    }
}
var user = new User('法外狂徒张三')
user.Hi()

ES6通过extends关键字继承父类的属性和方法

class Father{
    constructor(x, y){ 
        this.x = x
        this.y = y
    }
    add(){
        console.log(this.x + this.y)
    }
}
class Child extends Father{
    constructor(x, y){  // 构造方法,通过new命令生成对象实例时,自动调用该方法
        super(x, y)    // 执行父类的构造函数
        this.x = x     // 必须先执行父类的构造函数,子类才能用this声明自己的属性
        this.y = y     // this指向创建出来的实例对象
    }
    sub(){            //子类自己的方法
        console.log(this.x - this.y)
    }
}
var child = new Child(1,1)
child.add()          // 调用父类的方法
child.sub()

ES6之前我们通过构造函数来模拟类

function User(name){
    this.name = name
}
//如果方法在构造函数里面定义,那么每创建一个实例对象就要为方法开辟内存空间,太浪费了
//把方法定义在prototype(原型对象)上面,所有创建的实例就可以通过__proto__属性共享方法了
//ES6用class声明的类,它里面的方法也是这样干的
User.prototype.Hi = function(){   
    console.log('Hi'+ this.name)
}
var user = new User('法外狂徒张三')
user.Hi()       //user身上本来没有Hi方法的,通过__proto__属性去prototype(原型对象)身上找

ES6之前我们通过构造函数+原型对象来模拟类的继承

通过构造函数来继承属性

通过原型对象来继承方法

function Father(name){
    this.name = name
}
Father.prototype.Hi = function(){
    console.log('Hi')
}
function Child(name){
    // 通过构造函数来继承属性
    // 子构造函数要想使用父构造函数的属性必须把它的this重新指向到自己
    Father.call(this,name)   
}
// 通过原型对象来继承方法
Child.prototype = new Father() // 实例对象既可以拿到构造函数的方法,又不会影响原来的构造函数
Child.prototype.constructor = Child //重新指会自己的构造函数
var child = new Child('法外狂徒张三')
console.log(child.name)
child.Hi()