在javascript中重新定义Array构造函数

bal*_*teo 6 javascript

说我有以下代码:

var secrets;
Array = function() {
  secrets = this;
};
Run Code Online (Sandbox Code Playgroud)

上面的示例的作者说,代码正在重新定义Array构造函数.首先,我不确定所指的this是什么.任何人都可以建议吗?

第二:以下代码是否相同?

var secrets;
function Array() {
  secrets = this;
}
Run Code Online (Sandbox Code Playgroud)

顺便提一下,上面的代码来自以下关于Json漏洞的文章:请参阅此处

zer*_*osh 5

在这两个例子中你定义的变量Array是一个function指派thissecrets.事实上,已经存在一个全局对象,称为Array页面中的其他JS可能会或可能不会用作Constructor制作数组.如果您弹出控制台并重新将Array指定为其他内容,则可能会开始从明确依赖的代码中获取错误Array.然而,字面上的数组[]继续工作得很好,事实上,它们__proto__仍然指向了什么Array.prototype.所以:

var arr1 = new Array('a','b','c');
// arr[0] -> 'a'

var arr2 = ['d','e','f'];
// arr[0] -> 'd'

var secrets;
Array = function() { secrets = this; };

var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function
// arr3[0] -> undefined
// Array is just a function, you can't make arrays with new Array anymore
// and arr3 is just a function


var arr4 = ['j','k','l'];
// arr4[0] -> 'j'
// making array literals still works
Run Code Online (Sandbox Code Playgroud)

至于this,没什么奇怪的,仍然遵循规则this.您分配函数的事实Array不会改变this行为方式.因此this指向浏览器中的全局对象,window除非您使用new或使用call或实例化apply

两个样本之间的区别是函数表达式和函数声明之间的区别,请参阅:Javascript中函数表达式与声明之间的区别是什么?