ES5&ES6类-继承-静态方法-单例

梳理一下es5,es6的类方法 及继承/静态方法/单例模式的实现!

ES5的 类&继承

es5里面function(构造函数) 就是类

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
function Person (name, age, job) {
this._name = name
this._age = age
this._job = job
this.introduce = function () {
console.log(`我叫${this._name}, ${this._age}岁`)
}
}
Person.prototype.job = function () {
console.log(this._job)
}


function Student (name, age, job) {
Person.call(this, name, age, job)
}
Student.prototype = new Person()
/**
* Person.call(this, name, age) ---> 使用call,进行construct.赋值Student的name和age
* new Person---> 返回了一个对象,包含了Person中的静态属性
* call只能继承构造函数上的属性,不能继承原型上的
* 原型链继承:可以继承构造函数里面以及原型链上面的属性和方法,实例化子类的时候没法给父类传参
*/

var xiaoming = new Student('小明', '18', '学生')

xiaoming.introduce() // 我叫小明, 18岁
xiaoming.job() // 学生

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
class Person {
constructor (name, age) {
this._name = name
this._age = age
}
introduce () {
console.log(`我叫${this._name}, ${this._age}岁`)
}
static staticFc1 () {
console.log('我是静态方法!')
}
}
Person.staticFc2 = function () {
console.log('我也是静态方法!!!')
}

class Student extends Person {
constructor (...args) {
super(...args)
}
}

let xiaogang = new Student('小刚', '20')
Person.staticFc1() // 我是静态方法!
Person.staticFc2() // 我也是静态方法!!!
xiaogang.introduce() // 我叫小刚, 20岁

单例模式

单例模式: 不管实例化多少次,永远只有一个实例. 确保所有对象都访问唯一实例

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

class Student {
static getInstane (name) {
if (!Student.instance) { // 如果没有被实例化过 --> 使用静态属性做flag
Student.instance = new Student(name)
}
return Student.instance // 返回唯一的实例
}

constructor (name) {
console.log('进行了实例化')
this._name = name
this.getFood()
}

getFood () {
console.log(this._name + '去拿外卖')
}
eatFood () {
console.log(this._name + '吃外卖')
}
}

let xiaoming = Student.getInstane('小明')
let xiaogang = Student.getInstane('小刚')

//进行了实例化
//小明去拿外卖
//小明吃外卖
//小明吃外卖
xiaoming.eatFood()
xiaogang.eatFood() // 虽然传入了不同的姓名,但是由于只实例化一次. 所以'小刚'不会被赋值给_name
-------------本文结束 感谢您的阅读-------------