1

很好奇为什么下面的代码会给出如此“奇怪”的结果:

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

4

1 回答 1

0

我认为这不像你描述的那样工作:看看这里的 jsfiddle

它像这样实现您的代码:

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()
});​

对象冻结不会阻止将属性和函数添加到您的函数f中。它只是冻结你实际冻结的对象。jQueryextend采用第一个参数并使用第二个参数对其进行扩展,因此不会触及您案例中的冻结对象。

于 2012-07-16T16:07:04.593 回答