node-类

node-类

  • ES5中
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
32
33
34
35
36
37
38
function Person(name, age) {
this.name = name;
this.age = age;
this.say = () => console.log(this);

}

// 给类的实例定义方法
Person.prototype.showName = function () {
console.log(this.name);
}

// 定义类的静态方法
Person.eat = function () {
console.log("eat.....");
}
/**new的作用:
* 1、创建一个对象
* 2、调用构造方法,传入对应参数
* 3、把this指向第一次创建的对象
* 4、执行构造函数里面的代码
*/
let person = new Person('node', 11);
person.say()

// 继承
function Teacher(name, age, subject) {
// 子类继承父类的属性,需要需要将this指向父类中的属性
Person.call(this, name, age)
this.subject = subject;
}
// 子类继承父类的方法
Teacher.prototype = new Person()

let t = new Teacher('l', 22, 'shuxue');
t.say()
t.showName()
// Teacher.eat()
  • 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// ES6后
/**注意要点
* 1、实例化方法和实例化属性都是给实例化对象调用,静态方法只能类名调用
* 2、每一个实例化对象在内存中独立存在的,有自己的属性和方法,互不影响,相互独立
* 3、
*
*/
class Animal { // 定义一个类
static num = 10; // 静态属性
// 构造器
constructor(name) {
// 实例化的时候执行
this.name = name; // 实例属性
}

// 定义一个实例方法
showName() {
console.log(this.name);
}

// 静态方法,通过类名调用
static eat() {
console.log('eat');
}
}


let dog = new Animal('dog'); // 实例化对象
dog.showName(); // dog, 调用实例方法
Animal.eat(); // eat, 调用静态方法
console.log(Animal.num); // 10, 调用静态属性

// ES6后
/**继承
* 格式:class 子类名 extends 父类 {}
*/
class Cat extends Animal {
constructor(name) {
// 重写constructor方法使父类的constructor失效,
// 可以调用super()调用父类的constructor方法
// super()方法必须在使用this前面:this在调用父类的constructor方法才起作用
super(name);
this.age = 10;
}
// 重写:子类方法名和父类一样,覆盖父类的方法,调用子类的方法
showName() {
console.log(`${this.name}:喵喵喵`);
}
}

let cat = new Cat("汤姆")
cat.showName() // 汤姆:喵喵喵