从js中的对象返回一个值

时间:2012-09-03 13:22:57

标签: javascript

假设我在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语句?

3 个答案:

答案 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();

如果你真的希望rtrue,那么我认为没有理由将该函数称为构造函数。

您获得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` 是一个对象,但在各种操作中的行为类似于值ttrue)。这很强大,但也可能很混乱,因为类型转换有点隐含,而且它不是经常在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