从js中的对象返回一个值

return a value from object in js

本文关键字:一个 返回 js 对象      更新时间:2023-09-26

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

但作为回应,我再次得到测试{}在这种情况下,如何编写退货声明?

我认为您需要执行以下操作:

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

然后

var r=new test();
if (r.value == true) {
    //Do something
}

首先,我觉得有必要澄清一个可能的误解:

function test(){
    var value=true;
}

不是具有私有变量的对象。它是一个带有局部变量的函数。当您使用new调用函数时,它会创建一个继承自函数原型的对象,该对象没有属性。如果您正常调用函数,它只执行函数体并返回undefined(因为您没有返回任何内容)。


解决方案:

你真的需要构造函数吗?我这么问是因为你的例子很简单。显然,不能让函数返回两个值,true和对象。

因此,您可以在没有new:的情况下调用函数

function test() {
    var value = true;
    return value;
}
var r = test();

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

您之所以得到test {}作为结果,是因为您使用new调用了函数。如果您这样做,函数将始终返回一个对象,如果您不显式地这样做(value是布尔值,而不是对象),它将隐式返回this(这是一个对象)
因此,如果您真的希望函数内部的r等于value,那么就不要用new调用函数。


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

你可以将值分配给一个属性并访问它,就像PokeHerOne在他的回答中显示的那样,或者添加一个返回该值的函数,就像Papiatis所展示的那样。优点是可以显式地访问值,其他查看代码的人可以了解发生了什么

此外,根据您想要对该值/对象执行的操作,您可以实现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是一个对象,但在各种操作中的行为类似于值truevalue)。这很强大,但也可能很令人困惑,因为类型转换在某种程度上是隐式的,而且它在JavaScript中并不经常使用。

使用内部定义的方法:

function TestClass(){
    var value = true;
    this.getValue = function(){
        return value;
    };
}
var t = new TestClass();
alert(t.getValue()); // true

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

alert(t.value) // undefined