Skip to content

类(‌class)‌

作用

  • ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,

  • 它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

特点

知识点

  • class 声明类
  • constructor定义构造函数初始化
  • extends继承父类
  • super 调用父级构造方法
  • static定义静态方法和属性
  • 父类方法可以重写

ES6和ES6对比

js
// ES5
function Car(brand, price) {
    this.brand = brand;
    this.price = price;
}
Car.prototype.change = function () { 
    console.log('我可以拉人');
};

let HUAWEI = new Car('HUAWEI', '420000');

HUAWEI.change(); //我可以拉人
console.log(HUAWEI); // Car {brand: 'HUAWEI', price: '420000'}

// ES6
class Car2 {
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    change() {
        console.log('我可以拉人2');
    }
}

let XIAOMI = new Car2('XIAOMI', '290000');

XIAOMI.change(); //我可以拉人2
console.log(XIAOMI); // Car2 {brand: 'XIAOMI', price: '290000'}

class静态成员

js
// ES5
function Car() {}
Car.name = '小汽车';
Car.prototype.change = function () {
    console.log('我可以拉人');
};
Car.prototype.size = '2吨';

let HUAWEI = new Car();

HUAWEI.change(); //我可以拉人
console.log(HUAWEI.name); // undefined
console.log(HUAWEI.size); // 2吨

// ES6
class Car2 {
    //静态属性
    static name = '小汽车';
    static change() {
        console.log('我可以拉人2');
    }
}

let XIAOMI = new Car2();

XIAOMI.change(); // XIAOMI.change is not a function
console.log(XIAOMI.name); // undefined

继承

js
// ES5

// 声明一个手机构造函数
function Phone(brand, price) {
    this.brand = brand;
    this.price = price;
}
Phone.prototype.change = function () {
    console.log('我可以打电话');
};

// 继承父类
function SmartPhone(brand, price, color) {
    Phone.call(this, brand, price);
    this.color = color;
}

// 设置子级构造函数的原型
SmartPhone.prototype = new Phone();

// 声明子级构造函数方法

SmartPhone.prototype.photo = function () {
    console.log('我可以拍照');
};

const xaiomi = new SmartPhone('小米', '1999', '白色');

console.log(xaiomi); // SmartPhone {brand: '小米', price: '1999', color: '白色'}
xaiomi.change(); //我可以打电话
xaiomi.photo(); //我可以拍照
// ES6

class Phone2 {
    // 构造方法
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    // 父类的成员属性
    change() {
        console.log('我可以打电话2');
    }
}

class SmartPhone2 extends Phone2 {
    // 构造方法
    constructor(brand, price, color) {
        super(brand, price);
        this.color = color;
    }

    photo() {
        console.log('拍照2');
    }
}

const xaiomi2 = new SmartPhone2('小米', 999, '黑色');
console.log(xaiomi2); // SmartPhone2 {brand: '小米', price: 999, color: '黑色'}
xaiomi2.change(); //我可以打电话2
xaiomi2.photo(); //拍照2

子类对父类方法的重写

js
// ES6
class Phone2 {
    // 构造方法
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    // 父类的成员属性
    change() {
        console.log('我可以打电话2');
    }
}

class SmartPhone2 extends Phone2 {
    // 构造方法
    constructor(brand, price, color) {
        super(brand, price);
        this.color = color;
    }

    photo() {
        console.log('拍照2');
    }

    change() {
        console.log('我可以视频通话');
    }
}

const xaiomi2 = new SmartPhone2('小米', 999, '黑色');
console.log(xaiomi2); // SmartPhone2 {brand: '小米', price: 999, color: '黑色'}
xaiomi2.change(); //我可以视频通话
xaiomi2.photo(); //拍照2

get 和 set 的设置

js
// ES6
class Phone {
    get price() {
        console.log('价格属性被读取了');
    }
    set price(newVal) {
        console.log('价格属性被设置了');
    }
}

let s = new Phone();

s.price; //价格属性被读取了
s.price = '1999'; // 价格属性被设置了

Released under the MIT License.