JS单例模式的一种应用

来自 segmentfault 的问答,关于js构造函数的返回值的问题的讨论。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function Universe() {

// 缓存的实例
var instance = this;

// 其它内容
this.start_time = 0;
this.bang = "Big";

// 重写构造函数
Universe = function () {
return instance;
};
}

// 测试
var uni = new Universe();
var uni2 = new Universe();
uni.bang = "123";
console.log(uni === uni2); // true
console.log(uni2.bang); // 123

问题:

两次new出来的实例为什么是相等的???

代码解析:

正常情况下,通过 new 运算符产生的实例对象是不同的。比如:

1
2
3
4
5
6
7
function Bar (name, color) {
this.name = name;
this.color = color;
}
var b1 = new Bar();
var b2 = new Bar();
console.log(b1 === b2); // false

该示例中的构造函数中,在最后重写了构造函数,并返回了 this 所指向的对象。在 Javascript 中的构造函数中,使用 new 关键字调用的情况下,如果未显示的返回一个对象,则默认返回 this 指向的对象。也就是说未显示返回一个对象的情况下,this默认指向新创建的实例对象。否则,新创建的实例对象等于显示返回的对象。然而在本例中第一次通过 new 调用该构造函数后,重写后的构造函数中返回了上一次的this 对象,也就是之后的new出来的实例对象都会指向第一次的实例对象。因此之后的实例对象都是相等。

问题来源:

js中单例模式疑惑(来自segnmentfault)

参考链接:

javascript秘密花园关于构造函数的描述

作者

monster1935

发布于

2017-06-29

更新于

2024-09-25

许可协议