为什么Array()。切片没有“新”工作?

时间:2012-03-10 09:26:42

标签: javascript

From here

function highest(){ 
  return makeArray(arguments).sort(function(a,b){ 
    return b - a; 
  }); 
} 

function makeArray(array){ 
  return Array().slice.call( array ); 
} 

assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results.");

现在,为什么Array()甚至在没有new运算符的情况下返回有意义的内容?如果在没有undefined的情况下调用,我在JS中看到的大多数“类”定义都返回new

function User(name) {
  this.name = name;
  this.jump = function() {
    console.log(name + " is jumping!");
  }
}

assert(typeof(User("no New")) == 'undefined');

2 个答案:

答案 0 :(得分:6)

specification明确规定:

  

Array作为函数而不是构造函数调用时,它会创建并初始化一个新的Array对象。因此函数调用Array(…)等同于具有相同参数的对象创建表达式new Array(…)

如何在内部完成取决​​于实现,但对于自定义构造函数,您可以使用以下技巧:

if(!(this instanceof User)) return new User(name);

...因为new User(...)this设置为创建的User实例,而User(...)将其设置为全局对象。 (所以你实际上是在最后一个片段中设置全局变量。)

答案 1 :(得分:1)

根据Chrome的调试面板,Array()以与新Array()[]相同的方式返回新数组。我的猜测是它要么易于使用该语言,要么与[]语法相关(当然这不需要新的语法)。

实际上,您可以使用自己的功能来选择新的:

function User(name) {
    if (!(this instanceof User)) {
        return new User(name);
    }
    this.name = name;
    this.jump = function() {
        console.log(name + " is jumping!");
    };
}

​

然后 User('blah') new User('blah')都工作。