在对象初始值设定项中设置属性时不再调用setter:这是什么意思?

Pit*_*taJ 5 javascript

在这个JS MDN页面上,它说:

JavaScript 1.8.1注意事项

从JavaScript 1.8.1开始,在对象和数组初始值设定项中设置属性时不再调用setter.

我只是无法弄清楚这是想告诉我的.

rua*_*akh 7

这段代码片段:

var o = {};
o.seven = 7;
Run Code Online (Sandbox Code Playgroud)

这个代码片段:

var o = { seven: 7 };
Run Code Online (Sandbox Code Playgroud)

通常是等价的; 但如果它们前面有这段代码片段:

Object.prototype.__defineSetter__('seven', function(x) { alert(x); });
Run Code Online (Sandbox Code Playgroud)

然后只有前者会发出警报7(因为setter被调用o.seven = 7,而不是被调用o = { seven: 7 }),只有后者才会被设置o.seven7.


Ber*_*rgi 4

我认为这指的是JSON劫持的问题。看一下

\n\n\n\n

要重新发布我对这个已删除问题的回答:

\n\n
\n

根据规范,数组 ( EcmaScript 5.1\n \xc2\xa711.1.4 ) 和对象文字\n ( EcmaScript 5.1 \xc2\xa711.1.5 ) 都不应被劫持:

\n\n
    \n
  • 他们称之为“具有该名称的标准内置构造函数”,而不是您可能覆盖的名称window.Arraywindow.Object
  • \n
  • 他们使用 [[defineOwnProperty]],它绝对不处理Object.prototype.
  • \n
\n
\n\n

如今,在兼容 ES 5.1 的浏览器中这不再是问题。

\n