最近项目中用到了类的概念,其实更早的时候已经接触到了,现在捡起来过一遍,还不晚
ES5
实现
ES5 可以通过构造函数进行类的实现。
1 2 3 4 5 6 7
| function Person(name, age) { this.name = name; this.age = age; this.run = function () { console.log(this.name + ' is running'); } }
|
构造函数实际就是一个普通函数,但我们可以通过 new 关键词进行实例化。在构造函数中声明实例属性和方法,实例上就能读取调用。
1 2 3 4 5 6 7 8 9
| let person1 = new Person('张三', 18); let person2 = new Person('李四', 20);
console.log(person1.name); console.log(person2.age);
person1.run(); person2.run();
|
静态属性和方法
可以在类上添加静态属性和方法,我们能通过类名访问到它们。实例对象不能直接调用类的静态属性方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Person.words = 'I am a person'; Person.say = function () { console.log(`Person saying: \"${Person.words}\"`); }
console.log(Person.words);
Person.say();
|
原型属性和方法
可以在类上添加原型属性和方法,我们能通过实例对象访问它们。类不能直接调用原型属性方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Person.prototype.weight = 60; Person.prototype.lostWeight = function () { this.weight--; console.log(`${this.name}\'s weight is ${this.weight} now!`); }
console.log(person1.weight);
person1.lostWeight();
|
ES6
实现
在 ES6 中,类由 class 关键词实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Animal { constructor(name, age) { this.name = name; this.age = age; } speak() { console.log(this.name + ' makes a noise.'); }
static eat() { console.log(this.words); } static words = 'All animals eat food.'; }
|
调用方法与 ES5 无异。
1 2 3 4 5 6
| Animal.eat();
let dog1 = new Animal('Teddy', 2);
dog1.speak();
|
静态属性和方法
与 ES5 无异。
1 2 3 4 5 6
| Animal.sleep = function () { console.log('All animals sleep.'); }
Animal.sleep();
|
原型属性和方法
与 ES5 无异。
1 2 3 4 5
| Animal.prototype.run = function () { console.log(this.name + ' is running.'); }
dog1.run();
|
最后
静态属性和方法服务于类本身,原型函数在类上添加但服务于实例。ES6 的 class 关键词是 ES5 构造函数的语法糖,创建有别使用无异。要搞明白后面类的继承还得从构造函数入手。