我有以下代码:
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是否允许对象调用它们的构造函数?
答案 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在每个任意对象上应用[自定义,非本机]构造函数。