Javascript在node.js中的新运算符

时间:2013-09-09 16:03:01

标签: javascript node.js oop constructor

我有以下代码:

    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为php开发人员。 Wrt行'var file = new static.Server();'作者说,对象是静态的,Server()是构造函数。怎么可能?在实例化类时调用构造函数。即使在实例化之后,javascript是否允许对象调用它们的构造函数?

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

  

theres是一个对象static而Server()是一个构造函数。怎么可能?

static是一个普通对象,具有Server属性,这是一个函数。您可以将此函数作为the new keyword的构造函数来调用。请参阅static,如命名空间。

  

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

在JavaScript中,constructors define a "class" construct。因此,应该是“调用构造函数来实例化一个对象(使用相应的原型)”。

  

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

技术上,是的。构造总是“创建一个新对象(具有继承等),然后调用它上面的构造函数来初始化对象”,这样就没有新闻了。但是,在JavaScript中,您可以使用the .call method在每个任意对象上应用[自定义,非本机]构造函数。