前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6中的类

ES6中的类

作者头像
宅蓝三木
发布2024-10-09 20:46:06
740
发布2024-10-09 20:46:06
举报
文章被收录于专栏:三木的博客

ES6中添加的class关键字其实并非真正的类,而是ES5用函数来模拟类的语法糖。在ES6中可以用如下的语法创建一个类:

代码语言:javascript
复制
class Students {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    sayName() {
        console.log(this.name);
    }
    sayAge() {
        console.log(this.age);
    }
}

let st1 = new Students('sen', 18);
st1.sayName();
st1.sayAge();

使用ES6的class语法糖和ES5自定义的类还是有些区别的:

  • 类的声明不会被提升,类的实例化只能在类的声明之后
  • 类声明中的代码只能运行在严格模式下
  • 类中的方法是不可枚举的
  • 实例化的时候必须加new关键字
  • 在方法内部修改类名会抛出错误,但可以在外部修改类名

下面的例子展示了如何在外部修改类名:

代码语言:javascript
复制
class Students {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    sayName() {
        console.log(this.name);
    }
    sayAge() {
        console.log(this.age);
    }
}

let st1 = new Students('sen', 18);
st1.sayName();
st1.sayAge();

let Stu = Students;

let st2 = new Stu('sen', 18);
st2.sayName();
st2.sayAge();

console.log(st1 instanceof Students); //true
console.log(st2 instanceof Students); //true
console.log(st2 instanceof Stu); //true
console.log(st1 instanceof Stu); //true
类中的访问器属性

可以使用get和set关键字来定义访问器属性,例如:

代码语言:javascript
复制
class Students {
    constructor(name) {
        this.name = name;
    }
    get n() {
        return this.name;
    }
    set n(value) {
        this.name = value;
    }
}

let st1 = new Students('sen', 18);
console.log(st1.n);
st1.n = 'wang';
console.log(st1.n);
需计算的属性名

和其他需计算的名字一样,都是加上方括号,例如:

let propName = “sayName”;

代码语言:javascript
复制
class Students {
    constructor(name) {
        this.name = name;
    }
    [propName]() {
        console.log(this.name);
    }
}

let st1 = new Students('sen');
st1.sayName();
给类添加默认的生成器

可以利用Symbol来给类添加默认的生成器,如:

代码语言:javascript
复制
class Collection {
    constructor() {
        this.items = [];
    }
    *[Symbol.iterator]() {
        yield *this.items.values();
    }
}

let col = new Collection();
col.items.push(1);
col.items.push(2);
col.items.push(3);
for( let i of col) {
    console.log(i);
}
给类添加静态属性/方法

类的静态方法/属性只能通过类名来访问,而不能通过类的实例来访问,具体做法是在方法/属性定义前面加上static关键字,例如:

代码语言:javascript
复制
class Students {
    constructor(name) {
        this.name = name;
    }
    static sayClassName() {
        console.log("Collection");
    }
}

Students.sayClassName();
let stu = new Students('sen');
stu.sayClassName(); // error
类的继承

ES6引入了extends和super来实现类的继承,例如:

代码语言:javascript
复制
class Rectangle {
    constructor(length, width) {
        this.length = length;
        this.width = width;
    }
    getArea() {
        return this.length * this.width;
    }
}

class Square extends Rectangle {
    constructor(length) {
        super(length, length);
    }
}

let sq = new Square(5);
console.log(sq.getArea());

使用super需要注意:

  • super只能用在派生类中
  • 在constructor里,super负责初始化this,所以必须在this使用之前调用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类中的访问器属性
  • 需计算的属性名
  • 给类添加默认的生成器
  • 给类添加静态属性/方法
  • 类的继承
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档