Javascript JS闭包将对象实例作为接口返回
我有以下代码Javascript JS闭包将对象实例作为接口返回,javascript,ecmascript-5,Javascript,Ecmascript 5,我有以下代码 function Test() { this.funct_1 = function() { alert('funct_1'); } this.funct_2 = function() { alert('funct_2'); } return this;} 我正在努力实现以下目标。我想要一个类Test,它不是单例的。然后在我的应用程序的其他地方,我需要一个函数,它可以在每次脚本执行时返回相同的实例。我想我可以用闭包来表示getestobj 然而,当我尝试使用它时
function Test() {
this.funct_1 = function() {
alert('funct_1');
}
this.funct_2 = function() {
alert('funct_2');
}
return this;}
我正在努力实现以下目标。我想要一个类
Test
,它不是单例的。然后在我的应用程序的其他地方,我需要一个函数,它可以在每次脚本执行时返回相同的实例。我想我可以用闭包来表示getestobj
然而,当我尝试使用它时
getTestObj().funct_1();
我得到以下错误,表示未找到函数1()
在对象函数(){…}中找不到函数funct_1
很明显,我在这里犯了一些错误,但我无法通过网络找到任何可以帮助我的解决方案。如有任何意见,将不胜感激
注意:我被迫使用ECMA5testObj
被包装在一个函数中
所以,要么叫它
getTestObj()().funct_1(); //notice two ()()
将getTestObj()
的值保存在变量中
var singleTon = getTestObj();
var testObj = singleTon();
testObj.funct_1();
或者,简单地返回testObj
(以防不需要单例)
并将其作为
getTestObj().funct_1(); //notice single ()
getTestObj()正在返回一个函数,即:
function() {
return testObj;
}
因此,您必须再次调用它getTestObj(),这将返回测试的对象,现在您可以访问它的属性
getTestObj()().funct_1();
或
您可以将getTestObj函数更改为:
function getTestObj() {
var testObj;
if (!testObj) {
testObj = new Test();
}
return (function() {
return testObj;
}());
}
@gurvinder372在本例中,每次调用getestobj()
我都会得到Test
的一个新实例,但每次脚本执行只需要一个实例。另外,我不能在getTestObj()
getTestObj正在返回函数之外公开任何var
,因此必须将其称为getTestObj()(),这将返回测试类的对象。所以答案是:getestobj()().funct_1(),只需返回returntestobj
每次调用getestobj()
时,我都会得到一个新实例,但每次脚本执行时我都需要相同的实例。使用double()
我想这是一个解决方案,但是可以避免吗?我的意思是重新设计它,以避免双重()()
@bliss05我已经更新了答案,让它更清晰。谢谢!有一件事我不能在getestobj()
之外公开任何var
,它应该是获取Test
实例的唯一入口。@Bliss05您不必这样做,只有var singleTon
在外部声明和初始化。好的,我明白了。然而,是否有任何方法不使用任何额外的var
实例,而只使用闭包?
getTestObj()().funct_1();
function getTestObj() {
var testObj;
if (!testObj) {
testObj = new Test();
}
return (function() {
return testObj;
}());
}