不,不再可能捕获在Firefox 21,Chrome 27或IE10中传递给
[]或
{}构造函数的值。var capture = function() { var ta = document.querySelector('textarea') ta.innerHTML = ''; ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments))); return arguments;}var original = Array;var toggle = document.body.querySelector('input[type="checkbox"]');var toggleCapture = function() { var isOn = toggle.checked; window.Array = isOn ? capture : original; if (isOn) { Object.defineProperty(Object.prototype, 'foo', {set: capture}); } else { delete Object.prototype.foo; }};toggle.addEventListener('click', toggleCapture);toggleCapture();[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) { el.addEventListener('click', function() { document.querySelector('textarea').innerHTML = 'Safe.'; eval(this.value); });});<div><label><input type="checkbox" checked="checked"> Capture</label></div><div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div><div><textarea></textarea></div>它重写
window.Array和添加一个setter,
Object.prototype.foo并通过短格式和长格式测试初始化数组和对象。
的ES4规范,在第1.5节,“需要的对象和阵列的全球性的,标准绑定到被用于构建用于对象和数组的初始化新对象”在实施先例与指出,“InternetExplorer6中,歌剧9.20,和Safari3执行不尊重Object和Array的本地或全局重新绑定,而是使用原始的Object和Array构造函数。”这在ES5第11.1.4节中保留。
Allen Wirfs-Brock解释说,ES5还指定对象初始化不应触发设置方法,因为它使用DefineOwnProperty。MDN:使用对象指出:“从Javascript1.8.1开始,在对象和数组初始化程序中设置属性时,不再调用setter。”



