- 当使用
typeOf User
的时候,得到的打印结果是function
,所以类是一个特殊的函数,但是函数存在函数提升,类却没有,所以必须在调用之前声明。 - 只能通过
new
关键字来调用。 - 函数名可以用计算属性的方式定义,如:
[methodName](){ // 函数体 }
。
class User {
// 构造方法
constructor(name, email) {
this.name = name;
this.email = email;
}
// 方法之间没有逗号分隔
info() {
console.log(`Hi,i am ${this.name},my email is ${this.email}`);
}
// 静态方法用 `static` 来定义,只能在User对象上调用,就是原型对象调用,不能在实例上调用
static description() {
console.log(`I am a human`);
}
// `set` 方法
set github(value) {
this.githubName = value;
}
// `get` 方法
get github() {
return `https://github.com/${this.githubName}`;
}
}
const dp = new User('dp', '[email protected]');
dp.info();
User.description();
dp.github = 'dptms';
console.log(dp.github);
class Animal {
constructor(name) {
this.name = name;
this.belly = [];
}
eat(food) {
this.belly.push(food);
}
}
// 通过 `extends ` 关键字实现继承
class Dog extends Animal{
constructor(name,age){
// 通过 `super` 调用父类构造方法
super(name);
this.age = age;
}
bark(){
console.log('bark bark!') ;
}
}
const hot = new Dog('hot',2);
在 ES6 之前,我们很难在内建对象的基础上扩建自己的类。 ES6 的 Class 采用了另一种机制来解决这个问题。
class MovieCollection extends Array {
constructor(name, ...items) {
super(...items);
this.name = name;
}
add(movie) {
this.push(movie);
}
topRated(limit = 3) {
return this.sort((a, b) => a.score < b.score).slice(0, limit);
}
}
const movies = new MovieCollection('favorite movies',
{ name: 'The Croods', score: 8.7 },
{ name: 'The Shawshank Redemption', score: 9.6 },
{ name: 'Leon', score: 9.3 },
{ name: 'Days of summer', score: 8.0 },
);
movies.push({ name: '功夫熊猫', score: 9.7 })
console.log(movies.topRated());