2

重写 Array 函数后,为什么两个对象的行为不一样?

function Array(){}

var array1 = ['1','2']
var array2 = new Array();

console.log(array1.length);     // 2
console.log(array2.length);     // undefined

另外,Object()返回一个空对象实例,但使用用户定义的函数,我们必须使用new运算符,为什么?

4

1 回答 1

0

那(Object()没有new)是一个快捷方式,您也可以提供:

function Stuff(x){
  if(!(this instanceof Stuff)){
    console.log("You forgot 'new'");
    return new Stuff(x);
  }
  this.x=x;
}

var a=Stuff(1);
var b=new Stuff(2);
console.log(a,b);
是的,当您在本地覆盖 built-in 时Array,您会被那个卡住。但是已经存在的数组仍然是原始的,它们不会追溯适合您自己的类型,并且[]语法不受您的覆盖(的情况c)的影响:

var a=[1,2];
var b=new Array(3,4);

(function(){
  function Array(){}
  var c=[1,2];
  var d=new Array(3,4);
  console.log("a:",a);
  console.log("b:",b);
  console.log("c:",c);
  console.log("d:",d);
})()
(功能魔法对于b保持不受功能提升的影响是必要的)

于 2018-01-21T17:18:20.903 回答