JavaScript的写类方式(6)

时间到了2015年6月18日,ES6正式发布了,到了ES6,前面的各种模拟类写法都可以丢掉了,它带来了关键字 class,constructor,set,get,extends,super。

 

ES6的写类方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 定义类 Person
class Person {
 
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
 
  setName(name) {
    this.name = name;
  }
 
  getName() {
    return this.name;
  }
 
  toString() {
    return 'name: ' + this.name + ', age: ' + this.age;
  }
 
}
 
// 创建实例对象
var p = new Person('Backus', 35);
p instanceof Person; // true

以上定义了一个类,constructor 是构造器,这点和 Java 不同,Java的构造器名和类名相同。constructor 这种简写语法来定义构造函数,因此不需要添加 function 关键字。

 

需要注意:

  • 字段属于该类对象,不会出现在原型(prototype)上,如本例的name,age
  • 字段只能在constructor中定义

 

也可以使用表达式方式创建类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let Person = class {
 
    constructor(name, age) {
      this.name = name;
      this.age = age;
    }
   
    setName(name) {
      this.name = name;
    }
   
    getName() {
      return this.name;
    }
   
    toString() {
      return 'name: ' + this.name + ', age: ' + this.age;
    
}

 

ES6 还带来了属性访问器,set,get 后空格跟上对应的标识符即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person {
    constructor(name, age) {
      this._name = name;
      this._age = age;
    }
   
    set name(v) {
      this.name = v;
    }
    get name() {
      return `Name is ${this._name}`;
    }
    set age(v) {
        this.age = v;
    }
    get age() {
        return `Age is ${this._age}`;
    }
 
    get desc() {
        return this.name + ', ' + this.age;
    }
}
var p = new Person('Tim', 30);
console.log(p.name, p.age);
console.log(p.desc);

这里需要注意,使用访问器后 constructor 中的字段建议添加一个下划线(_)以区分访问器属性,否则会报错。访问器属性有强大的功能,你可以在其中添加额外的代码逻辑,此时赋值(使用=)或取值(使用.)将触发访问器函数代码。

 

再看看继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Man extends Person {
  constructor(name, age, school) {
    super(name, age); // 调用父类构造器
    this.school = school;
  }
 
  setSchool(school) {
    this.school = school;
  }
 
  getSchool() {
    return this.school;
  }
 
  toString() {
    return super.toString() + ', school:' + this.school; // 调用父类的toString()
  }
}
 
var man = new Man('张三', '30', '光明中学');
man instanceof Man; // true
man instanceof Person; // true
console.log(man);

以上代码中,constructor 和 toString 方法中,都出现了 super 关键字,它指代父类的实例(即父类的 this 对象)。 之前 ES5 有个 Object.getPrototypeOf 来获取父类的原型对象

 

 

可以继续阅读:

JavaScript继承方式(1)

posted on   snandy  阅读(2518)  评论(3编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2015-04-08 ES6箭头函数(Arrow Functions)
2014-04-08 正则表达式小括号的多义性
2011-04-08 事件模块的演变(3)
2011-04-08 事件模块的演变(2)
2011-04-08 事件模块的演变(1)
2011-04-08 attachEvent在IE6/7/8下添加同一个类型事件的多个handler执行倒序
2011-04-08 仅IE6/7/8中添加同一个事件handler多次触发后会执行多次
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示