好奇为什么以下代码会产生如此“奇怪”的结果:
var f = function() {}
$.extend(f, Object.freeze({foo1:"bar1"}));
键入Chrome(请注意更新 - 它位于 Chromium ,而不是 Chrome 来自此处及以下)控制台:
> f.foo1
Chrome控制台的结果是:
> undefined
此外,尝试以下方法:
$.extend(f, {foo2:Object.freeze([1,2,3])});
在Chrome控制台中输入内容:
> f.foo2
结果甚至更奇怪:
> function Object() { [native code] }
我做错了什么?为什么使用Object.freeze()
有这些含义?
更新:不在 Chrome 中,而是在 Chromium 18 中(写作时Ubuntu上的最新内容)。我想这是一个实现错误。接受唯一的答案,虽然效果仍然可以在我的浏览器上重现。
答案 0 :(得分:0)
我认为这与你描述的不同:have a look at the jsfiddle here
它实现了这样的代码:
var f = function() {}
$.extend(f, Object.freeze({
foo1: "bar1"
}));
$.extend(f, {
foo2: Object.freeze([1, 2, 3])
});
$(document).ready(function() {
document.getElementById('div').innerHTML = f.foo1.toString() + '<br/>' + f.foo2.toString()
});
Object freeze不会阻止将属性和函数添加到函数f
中。它只是冻结你实际冻结的对象。 jQuery的extend
接受第一个参数并使用第二个参数的属性扩展它,因此不会触及案例中的冻结对象。