使用Object.freeze()扩展函数对象 - 无法添加字段

时间:2012-07-16 15:58:31

标签: javascript jquery

好奇为什么以下代码会产生如此“奇怪”的结果:

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上的最新内容)。我想这是一个实现错误。接受唯一的答案,虽然效果仍然可以在我的浏览器上重现。

1 个答案:

答案 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接受第一个参数并使用第二个参数的属性扩展它,因此不会触及案例中的冻结对象。