Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS闭包将对象实例作为接口返回_Javascript_Ecmascript 5 - Fatal编程技术网

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

很明显,我在这里犯了一些错误,但我无法通过网络找到任何可以帮助我的解决方案。如有任何意见,将不胜感激


注意:我被迫使用ECMA5

testObj
被包装在一个
函数中

所以,要么叫它

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;
  }());
 }