gpt4 book ai didi

javascript单例问题

转载 作者:行者123 更新时间:2023-12-02 23:42:05 25 4
gpt4 key购买 nike

我刚刚阅读了一些关于 javascript 中单例设计讨论的帖子。我对设计模式是 100% 的新手,但正如我所看到的,因为根据定义,单例不需要实例化,从概念上讲,如果它不被实例化,在我看来,它不必被视为像从蓝图(类)创建的常规对象。所以我想知道为什么不只是将单例视为封装在某种作用域中的静态可用的东西,这应该就是全部了。

从我看到的线程中,大多数都通过传统的 javascript 创建了一个单例

new function(){} 

然后创建一个伪构造函数。

嗯,我只是认为对象文字就足够了:

var singleton = {
dothis: function(){},
dothat: function(){}
}

对吗?或者有人有更好的见解?

[更新]:我的观点是,为什么人们不使用更简单的方法在 javascript 中创建单例,如我在第二个片段中所示,如果有绝对原因,请告诉我。我通常很害怕这种情况,所以我把事情简单化了:D

最佳答案

我同意你的观点,最简单的方法是使用对象文字,但如果你想要私有(private)成员,你可以利用 closures 来实现:

var myInstance = (function() {
var privateVar;

function privateMethod () {
// ...
}

return { // public interface
publicMethod1: function () {
// private members can be accessed here
},
publicMethod2: function () {
// ...
}
};
})();

关于 new function(){} 构造,它将简单地使用匿名函数作为 constructor function ,该函数内的上下文将是一个将返回的新对象。

编辑:响应 @J5's comment ,这很简单,实际上我认为这可以是使用延迟函数定义模式的一个很好的例子:

function singleton() {
var instance = (function() {
var privateVar;

function privateMethod () {
// ...
}

return { // public interface
publicMethod1: function () {
// private members can be accessed here
},
publicMethod2: function () {
// ...
}
};
})();

singleton = function () { // re-define the function for subsequent calls
return instance;
};

return singleton(); // call the new function
}

当第一次调用该函数时,我创建对象实例,并将 singleton 重新分配给一个新函数,该函数的闭包中包含该对象实例。

在第一次调用结束之前,我执行重新定义的 singleton 函数,该函数将返回创建的实例。

以下对 singleton 函数的调用将仅返回存储在其闭包中的实例,因为新函数将被执行。

你可以通过比较返回的对象来证明这一点:

singleton() == singleton(); // true

对象的==运算符只有在两个操作数的对象引用相同时才会返回true,即使是返回false如果对象相同但它们是两个不同的实例:

({}) == ({}); // false
new Object() == new Object(); // false

关于javascript单例问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1895635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com