最近我尝试用JavaScript学习设计模式。所以我选择Singleton Pattern作为我的第一个模式。但问题是当我读到这段代码时。
var Singleton = (function () {
var instance;
function createInstance() {
var object = new Object("I am the instance");
return object;
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
function run() {
var instance1 = Singleton.getInstance();
var instance2 = Singleton.getInstance();
alert("Same instance? " + (instance1 === instance2));
}
我只是想知道JavaScript中的实例是什么。似乎每个对象都有它的实例。我可以将其作为构造函数进行成像吗?
答案 0 :(得分:0)
instance
只是一个存储Object
实例的变量,该实例被捕获在闭包内,只能通过getInstance
访问。
var Singleton = (function () {
// 2. `instance` gets defined with value `undefined`
var instance;
// 3. `createInstance` gets declared inside the closure
function createInstance() {
// 8. `createInstance` creates an instance of `Object` and returns it
var object = new Object("I am the instance");
return object;
}
// 4. The closure returns an object with getInstance, and gets assigned to `Singleton`
return {
getInstance: function () {
// 6. Check if `instance` refers to something
if (!instance) {
// 7. Which it doesn't, so it calls `createInstance` and assigns it to `instance`
// where `instance` is the variable declared in the closure in step 2
instance = createInstance();
}
// 9. Return whatever is assigned to `instance`
// 11. since `instance` already points to something, return it
return instance;
}
};
// 1. This function executes immediately
})();
function run() {
// 5. `getInstance` is called and assigned to instance1
var instance1 = Singleton.getInstance();
// 10. `getInstance` is called again and assigns whatever is returned to instance2
var instance2 = Singleton.getInstance();
// instance1 === instance2 because `getInstance` returned the same thing.
alert("Same instance? " + (instance1 === instance2));
}
答案 1 :(得分:0)
想象一下,你有一个像这样的课程
Car {
var color,
var model,
var property
}
当你声明一辆新车时,你正在创建一个新的Car类实例,换句话说,你在“内存”上创建(这并非总是如此)一个新对象Car的新空间。 / p>
现在想象一下,在你的项目中你只需要一辆车,这辆车将一直都是一样的。 如果你想确保你只有一辆车,你需要使用单件模式。
如何运作?
单例模式使构造函数变为私有,而不是访问类的构造函数,您应该访问“getInstance”方法,此方法检查是否有任何类先生创建Car(返回示例),如果它是true返回先前为Car创建的同一实例,如果为false则创建一个新Car。
答案 2 :(得分:-1)
实例只不过是您在javascript中使用构造函数创建的对象。 Javascript没有任何称为类的东西,但你可以创建行为类似于类的函数。你可以通过使用" new"来调用它来实例化这个函数。关键词。以下是您的示例:
function class {
this.name = 'John';
}
var instance = new class();
alert(instance.name); // this alerts "John"
现在,Singleton类总是返回相同的实例,而不管您在此类中实例化对象的次数。