0

我有以下代码:

    var http = require('http');
    var static = require('node-static');
    var file = new static.Server();
    http.createServer(function (req, res) {
    file.serve(req, res);
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');

从书中,node.js for php 开发人员。Wrt line 'var file = new static.Server();' 作者说有一个静态对象,Server() 是一个构造函数。这怎么可能?实例化类时调用构造函数。即使在实例化之后,javascript 是否允许对象调用其构造函数?

4

3 回答 3

10

JavaScript 没有任何类。它只有对象,对象就像 PHP 中的关联数组。例如,考虑以下 PHP 代码:

$foo = array(
    "bar" => "baz",
    "baz" => "bar"
);

在 JavaScript 中,你可以这样写:

var foo = {
    bar: "baz",
    baz: "bar"
};

然而,JavaScript 真正酷的地方在于它具有一流的功能。PHP 没有(@$&#%!PHP)。这意味着 JavaScript 中的函数只是值。您可以将它们存储在变量中,将它们作为参数传递并返回值,甚至将它们放在对象上。例如:

var object = {
    add: function (x, y) {
        return x + y;
    }
};

object.add(2, 3); // 5

有趣的是,JavaScript 是函数式和面向对象编程风格的融合,这两种编程风格如此错综复杂地交织在语言的结构中,以至于无法将它们分开。

例如,在 JavaScript 中创建对象的主要方法是使用函数。一个函数可以被正常调用,也可以作为构造函数调用(即通过在函数调用前加上new关键字)。当函数作为构造函数调用时,JavaScript 在后台创建一个新对象,并使用构造函数对其进行初始化。例如:

function Person(firstname, lastname) {
    this.fullname = firstname + " " + lastname;
}

var me = new Person("Aadit", "Shah");
alert(me.fullname); // Aadit Shah

在您的情况下,函数Server是对象的属性static(这有效地使函数Server成为 的方法static)。与其他编程语言中的方法一样,我们将其称为如下:

static.Server();

this在这种情况下,函数内部的特殊变量Server将指向对象static,因为它被称为static. 但是this并不总是static取决于情况:

var o = {};
var Server = static.Server;

Static();                   // this will be the global object
Static.call(o);             // this will be the object o
new static.Server;          // this will be the newly created object

如您所见,JavaScript 是一种非常动态且用途广泛的语言,它PHP 强大得多。我建议你从这里开始学习 JavaScript:https ://developer.mozilla.org/en/learn/javascript

于 2013-09-09T16:37:21.193 回答
0

有一个静态对象,Server() 是一个构造函数。这怎么可能?

static是一个普通的对象,它的Server属性是一个函数。您可以使用new关键字将此函数作为构造函数调用。看起来static像一个命名空间。

实例化类时调用构造函数。

在 JavaScript 中,构造函数定义了一个“类”构造。因此,它应该是“调用构造函数来实例化一个对象(具有相应的原型)”。

即使在实例化之后,javascript 是否允许对象调用其构造函数?

从技术上讲,是的。构造总是“创建一个新对象(使用继承等),然后调用它的构造函数来初始化对象”,所以这不是新闻。然而,在 JavaScript 中,您可以使用方法在每个任意对象.call应用 [自定义、非本地] 构造函数。

于 2013-09-09T16:58:56.100 回答
0

static是一个具有名为 的属性的对象Server
此属性的值是一个函数。

您的代码将该函数调用为构造函数。

static本身可能是一个普通对象(它的构造函数可能是Object

于 2013-09-09T16:06:15.013 回答