假设我在js中有一个带有一个私有变量的简单对象:
function test(){
var value=true;
}
现在我想创建一个实例:
var r=new test() //I want to get r === true
如何从中返回值?
如果我写:
function test(){
var value=true;
return value;
}
我在结果中有一个测试{}。
如果我写:
function test(){
var value=true;
return function(){ return value; }
}
然后我可以获得该值,但我必须添加额外的括号:
var r = new test()()// r === true
我不想要括号,所以我尝试将代码更改为:
function test(){
var value=true;
return (function(){ return value; } )();
}
但作为回应,我又得到了测试{} 如何在这种情况下编写return语句?
答案 0 :(得分:4)
我相信你需要做一些事情:
function test(){
this.value = true;
}
然后
var r=new test();
if (r.value == true) {
//Do something
}
答案 1 :(得分:3)
首先,我觉得有必要澄清一个可能的误解:
function test(){
var value=true;
}
不是具有私有变量的对象。它是一个带有局部变量的函数。当您使用new
调用该函数时,创建一个继承自函数原型且没有属性的对象。如果你正常调用函数,它只是执行函数体并返回undefined
(因为你没有返回任何东西)。
你真的需要一个构造函数吗?我问,因为你的例子非常简单。显然你不能让函数返回两个值true
和对象。
所以,你可以在没有new
的情况下调用函数:
function test() {
var value = true;
return value;
}
var r = test();
如果你真的希望r
为true
,那么我认为没有理由将该函数称为构造函数。
您获得test {}
的原因是因为您使用new
调用了该函数。如果你这样做,函数总是返回一个对象,如果你没有明确地这样做(value
是一个布尔值,而不是一个对象),它会隐式返回{{1} (这是一个对象)
同样,如果你真的希望this
在函数内等于r
,那么就不要用value
来调用函数。
如果你需要一个物体,有几种方法:
您可以将值分配给属性并改为访问,例如PokeHerOne中显示的his answer或添加返回该值的函数papaiatis demonstrates。优点是可以显式访问该值,并且查看代码的其他人可以了解正在发生的事情。
此外,根据您要对该值/对象执行的操作,您可以实现new
方法,这些方法由各种运算符调用。
例如:
valueOf
即。 function Test(){
var value = true;
this.valueOf = function() {
return value;
}
}
var t = new Test();
console.log(t); // logs the Test instance
console.log(t == true); // logs `true`
是一个对象,但在各种操作中的行为类似于值t
(true
)。这很强大,但也可能很混乱,因为类型转换有点隐含,而且它不是经常在JavaScript中使用的东西。
答案 2 :(得分:0)
内部定义的使用方法:
function TestClass(){
var value = true;
this.getValue = function(){
return value;
};
}
var t = new TestClass();
alert(t.getValue()); // true
由于value
被定义为私有,因此无法从外部访问:
alert(t.value) // undefined