在Javascript中将参数传递给new()

时间:2012-12-18 03:54:43

标签: javascript oop node.js less

我开始使用Node.js,特别是使用LessCSS编译器。我在lessc脚本的源代码中看到了这个调用:

new(less.Parser) ({
    paths: [path.dirname(input)].concat(options.paths),
    optimization: options.optimization,
    filename: input,
    strictImports: options.strictImports,
    dumpLineNumbers: options.dumpLineNumbers
}).parse(data, function (err, tree) {
    //...
});

我不明白的是new(lessParser)({})来电是如何运作的。

从我读过的关于面向对象的Javascript我只发现了新的被调用的例子:object = new Someting

所以问题是:new在这种情况下如何运作?它是否将less.Parser称为构造函数?另外,什么是括号(在新的调用之后)执行/返回?

谢谢!

2 个答案:

答案 0 :(得分:3)

您发布的代码 完全 技术上(或更多或更少)与执行相同

var parserOptions = {
    paths: [path.dirname(input)].concat(options.paths),
    optimization: options.optimization,
    filename: input,
    strictImports: options.strictImports,
    dumpLineNumbers: options.dumpLineNumbers
};
var parser = new less.Parser(parserOptions);

parser.parse(data, function (err, tree) {
    //...
});

但是在“非常规”的地方有一些捷径和一些括号。

JavaScript是一种loose type语言,在tokens中进行了解释。这意味着只要语法得到尊重,它的语法就不会太受限制。

这让事情如下:

var a = false;
var b = function() { };
var c = false;
new(a || b || c)();

完全有效,并将创建b的新实例,因为它是在测试变量a之后定义的第一个非假值。 (注意,它不会检查b是否实际上是function。如果b是非假的而不是函数,则JS引擎会抛出它在运行时不是函数-time)

答案 1 :(得分:1)

真的只是评论。

表达式new(less.Parser)({…})new less.Parser({…})相同。

括号是一个分组运算符,表示“将此表达式计算为单个表达式”。当括号中的表达式返回不带括号的不同结果时,通常使用该语法,例如

var x, y = 7;

alert( typeof (x || y))  // "number"

alert( typeof  x || y )  // "undefined"

但是因为它们对OP的结果没有任何影响,所以它们毫无意义并且可能有害,因为它们将一个众所周知的模式转换为某些可能看起来好像new可以被称为函数的模式。