JS Constructor的返回值

时间:2014-05-08 09:29:23

标签: javascript constructor return

我觉得自己像个初学者。我不太明白为什么这两个代码表现不同。有人可以解释一下吗?我觉得我在这里想念一些JS机制。

代码1:

function Car(){
    var miles = 0;    

    function drive(dist){
        miles = miles+dist;
    }

    return {
       drive:drive,
       miles:miles
   }          
}

var car = new Car;
car.drive(50);

代码2:

function Car(){
    var miles = 0;    

    function drive(dist){
        miles = miles+dist;
    }

    return {
       drive:drive,
       miles:function(){
           return miles;
       }
   }          
}

var car = new Car;
car.drive(50);

因此它就像code1一样,JS为里程创建了一个新的范围/闭包/任何......值。也许聪明的人可以为这种行为提供一些背景知识。

小提琴:http://jsfiddle.net/P7Zqv/

2 个答案:

答案 0 :(得分:4)

JavaScript按值复制。

在第一个例子中:

  1. miles变量为0
  2. 返回一个对象,其中miles属性中包含0的副本。
  3. miles变量已更新(现在为50)。
  4. 读取miles属性(仍为0)。
  5. 在第二个例子中:

    1. miles变量为0。
    2. 返回一个对象,其miles属性包含一个返回miles变量值的函数。
    3. miles变量已更新(现在为50)。
    4. 调用miles函数并返回miles变量(50)的值。

答案 1 :(得分:-1)

第一个代码是按原样返回变量里程数,它正在被更新但是没有被读取,因为它在一个闭包中,就像Quentin提到的那样,第二个代码返回一个返回一个叫做getter的变量的函数在Javascript中,您已经创建了自己的getter函数,返回更新后的值,您可以在此处阅读有关getter函数的更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

简而言之,第一个代码返回一个变量里程,第二个代码返回一个返回变量里程的getter函数miles()。我希望有帮助:)

如果您尝试这样的事情:

代码3

function Car()
{
    var miles = 0;
    function drive(dist)
    {
        return miles += dist;
    }

    return {
        drive: drive,
        miles: miles
    };
}
var car = new Car();
car.drive(50); // returns 50 and not undefined

这样当调用car.drive(50)时,你不会得到一个未定义的函数,因为函数返回一个值。