JS构造函数的返回值

return value of JS Constructor

本文关键字:返回值 构造函数 JS      更新时间:2023-09-26

我觉得自己像个初学者。我不太明白为什么这两个代码的行为不同。有人能解释一下吗?我觉得我在这里错过了一些JS的机制。

Code1:

function Car(){
    var miles = 0;    
    function drive(dist){
        miles = miles+dist;
    }
    return {
       drive:drive,
       miles:miles
   }          
}
var car = new Car;
car.drive(50);

Code2:

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/

JavaScript按值复制。

在第一个例子中:

  1. miles变量为0
  2. 对象返回一个miles属性,其中包含0的副本。
  3. miles变量被更新(现在是50)。
  4. miles属性被读取(仍然是0)。

在第二个例子中:

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

第一个代码返回的变量英里,它被更新但没有被阅读,因为它是在一个闭包,就像昆汀所提到的,第二个代码是返回一个函数,它返回一个变量被称为一个getter函数在Javascript中,你使自己的getter函数,它返回更新后的值,你可以在这里阅读更多关于getter函数https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects。

简而言之,

第一个代码返回变量miles,第二个代码返回getter函数miles(),该函数返回变量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)被调用时,你不会得到一个undefined,因为函数返回一个值。