这个问题与在 Javascript 中声明数组时应遵循哪些最佳实践? https://stackoverflow.com/q/11500492/508537
假设有一个客户,我们就称他们为客户“D·B·库珀” http://en.wikipedia.org/wiki/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 的两个要求呢?
Note:D B。甚至写了测试小提琴 http://jsfiddle.net/briguy37/yXPJ8/帮助确保解决方案满足他的要求......真是一个人!
Update:对于那些喜欢挑战的人:请尝试找到一个不可劫持的跨浏览器解决方案来解决这个问题。例如,here's http://jsfiddle.net/yXPJ8/9/一个更加被劫持的测试用例(感谢重新格式化此 Bergi),它劫持了 Array、Object、Array.prototype.constructor 和 Object.prototype.constructor。到目前为止,看起来可能有一个特定于浏览器的解决方案(请参阅Bergi 对他的回答的评论 https://stackoverflow.com/a/11527758/508537,并让我们知道您是否找到了在 FF 中劫持它的方法),但目前尚不清楚是否有跨浏览器的解决方案。
无论你的Array
函数/构造函数是,数组的字面语法将始终生成“真实”数组,并将其 [[prototype]] 设置为本机数组原型对象(一次,此是一个安全漏洞 https://stackoverflow.com/questions/11500492#comment-15231480)。因此,您始终可以通过使用来访问它
Object.getPrototypeOf([])
even if Array
or [].constructor
被劫持。 (当Object
被劫持了,那么事情就变得非常复杂)
(带来了 D.B.向下! http://jsfiddle.net/yXPJ8/6/)
如果您想使用解决方法,in FF https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto以下行将始终有效(并且不可劫持):
[].__proto__.coolCustomFunction = coolCustomFunction;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)