在Javascript中覆盖全局函数

时间:2018-01-21 16:29:09

标签: javascript arrays object ecma

重写数组函数后,为什么两个对象的行为不同?

function Array(){}

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

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

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

1 个答案:

答案 0 :(得分: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);
是的,当你在本地覆盖内置的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不受函数提升影响的必要条件)