这个问题与What are the best practices to follow when declaring an array in Javascript? 有关
假设有一个客户,我们称它们为"D. B. Cooper",它首先要求以下代码必须在任何其他JavaScript代码之前运行:
Array = function(){
alert('Mwahahahaha');
};
此外,Cooper要求必须将自定义函数添加到内置的
Array
对象中(而不是被劫持的对象)。例如,如果未对Array
进行劫持,则可以使用:Array.prototype.coolCustomFunction = function(){
alert('I have ' + this.length + ' elements! Cool!');
};
可以负担:
var myArray = [];
myArray.coolCustomFunction();
但是,这与第一个要求不兼容。因此,如何最好地满足D. B. Cooper的两个要求?
注意: D.B.甚至写了 a test fiddle 来帮助确保解决方案满足他的要求……真是个家伙!
更新:
对于那些喜欢挑战的人:请尝试找到无法解决的跨浏览器解决方案来解决此问题。例如,here's甚至是劫持了更多的测试用例(感谢重新格式化此Bergi),它劫持了Array,Object,Array.prototype.constructor和Object.prototype.constructor。到目前为止,看来可能存在针对浏览器的解决方案(请参阅Bergi's comment on his answer,如果您找到了在FF中劫持它的方法,请告诉我们),但是目前尚不清楚是否有跨浏览器解决方案。
最佳答案
无论您的Array
函数/构造函数是什么,数组的文字语法都将始终生成其[[prototype]]设置为本机数组原型(prototype)对象的“真实”数组(此was a security vulnerability一次)。因此,您始终可以通过使用
Object.getPrototypeOf([])
即使
Array
或[].constructor
被劫持。 (当劫持了Object
时,它当然不起作用,那么它真的很复杂)(Brought D.B. down!)
如果要使用变通方法in FF,则以下行将始终有效(并且不可劫持):
[].__proto__.coolCustomFunction = coolCustomFunction;