覆盖 Javascript 中的全局函数
Overriding global functions in Javascript
覆盖Array函数后,为什么两个对象的行为不同?
function Array(){}
var array1 = ['1','2']
var array2 = new Array();
console.log(array1.length); // 2
console.log(array2.length); // undefined
另外,Object()
returns一个空的对象实例,但是有一个用户自定义函数,我们必须使用new
运算符,为什么?
那(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
不受函数提升影响所必需的)
覆盖Array函数后,为什么两个对象的行为不同?
function Array(){}
var array1 = ['1','2']
var array2 = new Array();
console.log(array1.length); // 2
console.log(array2.length); // undefined
另外,Object()
returns一个空的对象实例,但是有一个用户自定义函数,我们必须使用new
运算符,为什么?
那(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
不受函数提升影响所必需的)