【问题标题】:Passing parameters to new() in Javascript在Javascript中将参数传递给new()
【发布时间】:2012-12-05 05:57:29
【问题描述】:

我开始使用 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 的内容,我只发现了 new 被这样调用的示例:object = new Someting

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

谢谢!

【问题讨论】:

  • 我认为那些在一元运算符之后使用多余的括号以使它们看起来好像它们是函数的人试图变得聪明......并且失败了。
  • 我也开始这么想了。

标签: javascript oop node.js less


【解决方案1】:

您发布的代码完全在技术上(或多或少)与做的一样

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 是非 false 且不是函数,JS 引擎会在运行时抛出它不是函数。)

【讨论】:

  • 好吧,Yanick 发布的代码并不/完全/相同。在原始代码中,没有在全局命名空间中实例化任何对象。
  • @IvoC,怎么会这样?我只是将这些部分提取到单独的变量中。
  • @IvoC 为什么不解释就发表评论?
  • @Yanick。抱歉输入太快/编辑了我的原始评论。我认为您的回答在很大程度上是正确的,也许将“完全”替换为“大部分”或“或多或少”? (因为在您的示例代码中,“parser”和“parserOptions”正在当前命名空间中创建)
  • @IvoC,与我的代码的唯一区别是我声明三个变量并将数据分配给它们,而原始代码使用数据并创建less.Parser的实例没有将它分配给任何东西。但我将准确回答我的那一部分:) 技术上是正确的,但完全相同。
【解决方案2】:

真的只是评论。

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

括号是一个分组运算符,表示“将此表达式作为单个表达式进行评估”。当括号中的表达式在没有括号的情况下返回不同的结果时,通常使用该语法,例如

var x, y = 7;

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

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

但是由于它们对 OP 中的结果没有任何影响,因此它们毫无意义并且可能有害,因为它们会将众所周知的模式更改为在某些人看来似乎 new 可以作为函数调用的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2016-01-16
    • 2019-07-15
    • 2012-01-15
    • 2020-04-13
    • 2011-01-12
    相关资源
    最近更新 更多