Skip to content

Latest commit

 

History

History
93 lines (83 loc) · 2.17 KB

17.classes.md

File metadata and controls

93 lines (83 loc) · 2.17 KB

class 类

类的声明

  • 当使用 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());