0

假设我在 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; } )();
}

但作为回应,我再次得到 test {} 这种情况下如何编写 return 语句?

4

3 回答 3

4

I believe you need to do something like:

function test(){
    this.value = true;
}

and then

var r=new test();
if (r.value == true) {
    //Do something
}
于 2012-09-03T13:26:43.630 回答
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是一个布尔值,而不是一个对象),它会隐式返回this(这是一个对象)。
再说一次,如果你真的想从函数内部r等于,那么就不要用.valuenew


如果你需要一个对象,有几种方法:

您可以将值分配给属性并改为访问它,就像PokeHerOne他的答案中显示的那样,或者添加一个返回该值的函数,如papaiatis 演示的那样。优点是可以显式访问该值,并且查看您的代码的其他人可以理解发生了什么。

此外,根据您要对该值/对象执行的操作,您可以实现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`

Ie是一个对象,但在各种操作中t的行为类似于 value true( )。value这很强大,但也可能很混乱,因为类型转换有些隐含,并且在 JavaScript 中不经常使用。

于 2012-09-03T13:34:49.267 回答
0

内部定义的使用方法:

function TestClass(){
    var value = true;
    this.getValue = function(){
        return value;
    };
}

var t = new TestClass();
alert(t.getValue()); // true

由于value被定义为私有,因此无法从外部访问:

alert(t.value) // undefined
于 2012-09-03T13:30:28.563 回答