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

Javascript 在对象初始值设定项中设置属性时不再调用setter:这意味着什么?,javascript,Javascript,这一页上写着: JavaScript 1.8.1注释 从JavaScript1.8.1开始,setter不是 在对象和数组中设置属性时不再调用 初始化者 我就是不明白这是想告诉我什么。这段代码片段: var o = {}; o.seven = 7; var o = { seven: 7 }; Object.prototype.__defineSetter__('seven', function(x) { alert(x); }); 下面是代码片段: var o = {}; o.seven

这一页上写着:

JavaScript 1.8.1注释

从JavaScript1.8.1开始,setter不是 在对象和数组中设置属性时不再调用 初始化者

我就是不明白这是想告诉我什么。

这段代码片段:

var o = {};
o.seven = 7;
var o = { seven: 7 };
Object.prototype.__defineSetter__('seven', function(x) { alert(x); });
下面是代码片段:

var o = {};
o.seven = 7;
var o = { seven: 7 };
Object.prototype.__defineSetter__('seven', function(x) { alert(x); });
通常是等价的;但如果前面有以下代码段:

var o = {};
o.seven = 7;
var o = { seven: 7 };
Object.prototype.__defineSetter__('seven', function(x) { alert(x); });

然后只有前者会提醒
7
(因为setter是由
o.seven=7
调用的,而不是由
o={seven:7}
)调用的),只有后者会实际将
o.seven
设置为
7
,我认为这是指JSON劫持问题。看看

  • ,
将我的答案转发至:

根据规范,无论是数组()还是对象文本 ()应该是 可劫持:

  • 他们称之为“具有该名称的标准内置构造函数”,而不是您在
    window.Array
    window.Object
  • 它们使用[[defineOwnProperty]],这绝对不会考虑
    对象.prototype
    上的任何setter

如今,在兼容ES5.1的浏览器中,这应该不再是一个问题。

本文需要进行技术审查。
-参考ES5.1规范了解现代getter/setter语法(除非出于某种原因,您需要修补旧firefox的getter/setter。在这种情况下,我为您感到抱歉)c69-wah?我在哪里可以找到它?在页面的顶部。有一个红色警告。c69-o ES规范也没有帮助,我太累了