尝试澄清这段 JavaScript 代码

4

我现在正在编写一些代码,有一段代码我正在尝试理解。我已经阅读了一些相关资料,似乎这段代码使用了对象字面量。以下是代码:

var car = function(){

    // ...
    function drive(model, color){
        // ... do something
    }
    // ...

    return {
        start: drive
    }

}();

在其他文件中调用

car.start(audi, black);

那么这是如何工作的呢?首先,在JavaScript中,一个类可以有返回方法而不仅仅是方法。而且,返回方法使用对象字面量来调用一个方法?我在这里有点困惑。


1
顺便说一句,http://eloquentjavascript.net/ 是一个不错的阅读 :) - mb21
3个回答

3

首先,在JavaScript中似乎没有类。

它最接近的是构造函数,但你在这里没有任何构造函数。

那么这是怎么工作的?

car 是一个匿名函数的返回值,该函数一旦定义就会立即被调用(它在结尾的 } 后有 () )。

该返回值是使用对象字面量创建的对象。

该对象字面量的 start 属性的值是 drive 函数。在JavaScript中,函数是第一等公民,因此可以像任何其他类型的对象一样进行传递。


谢谢Quentin,现在我更明白了。 - Michael Nana
@MichaelNana - 在此处可以在您的浏览器控制台中查看其实际效果:http://jsfiddle.net/pratik136/Gbg4R/ - bPratik

2

这是一个封装模式。

  1. 对象:在Javascript中没有类,只有对象。 car 包含了一个与代码中 return 语句中所见结构一样的对象。
  2. 函数:外层函数是匿名的(没有名称)并且在定义之后直接被调用(括号在末尾)。
  3. 局部作用域drive 函数仅在包围函数的作用域中存在。你不能从外部调用 drive
  4. 封装:通过 return 语句,您可以控制哪些功能将从外部访问以及如何标记它们。因此,car 是具有一个属性 start 的对象,该属性是 drive 函数的定义。

如果您不使用括号调用 car.start ,则会得到函数本身的定义:

function (model, color) {
    ...
}

这是因为函数可以被赋值给变量(头等公民),而不需要实际调用它们,这样你就可以在稍后的时间内使用你选择的作用域调用预定义函数。
如果你调用 car.start(audi, black),你将执行具有给定参数的函数,并获得由 drive 函数返回的任何内容。

1
从代码看,你正在创建一个车的对象,然后从另一个文件调用drive函数,并通过变量model和color传递值audi和black。然后,你将对象实例("start")与其中包含的变量和操作一起返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接