Javascript 为什么将对象设置为不可扩展会使其[[prototype]]不可变?
报纸上说 此方法使目标的Javascript 为什么将对象设置为不可扩展会使其[[prototype]]不可变?,javascript,Javascript,报纸上说 此方法使目标的[[prototype]]不可变;任何[[prototype]]重新分配都将抛出类型错误。此行为特定于内部[[prototype]]属性,目标对象的其他属性将保持可变 我的问题是: 为什么将对象设置为不可扩展会使其[[prototype]]不可变? (Object.preventExtensions(),Object.seal(),Object.freeze()等)如果内部[[prototype]]]不是一个不可变的属性,则可以通过交换内部[[prototype]]来规避
[[prototype]]
不可变;任何[[prototype]]
重新分配都将抛出类型错误。此行为特定于内部[[prototype]]
属性,目标对象的其他属性将保持可变
我的问题是:
为什么将对象设置为不可扩展会使其[[prototype]]不可变?
(Object.preventExtensions()
,Object.seal()
,Object.freeze()
等)如果内部[[prototype]]]
不是一个不可变的属性,则可以通过交换内部[[prototype]]来规避对象.preventExtensions()
使用另一个值创建对象,有效地将新值上的所有属性添加到对象:
设a={};
//a现在具有Array.prototype的所有属性
setPrototypeOf(a,Array.prototype);
a、 推(foo);
控制台日志(a);
设b=Object.preventExtensions({});
//不能以相同的方式将属性添加到b
setPrototypeOf(b,Array.prototype);
b、 推(“杆”);
控制台日志(b)代码>很抱歉,我在解析标题问题时遇到问题。正如@Patrick所回答的,您是否在问“为什么将对象设置为不可扩展会使其[[prototype]]不可变?”?我还可以把它理解为“为什么其他将对象设置为不可扩展的方法不能使其[[prototype]]保持不变?”比如Object.seal()
或Object.freeze()
@HereticMonkey你的第二种解释没有意义Object.seal()
和Object.freeze()
除了其他效果外,还可以防止扩展(并使[[prototype]]不可变)。@PatrickRoberts告诉你,我将编辑这个问题以使它更清楚,好吗?显然,对你或作品的要求太多了?@HereticMonkey我无权使用特定的解释来编辑这个问题,因为这可能与作者的意图相冲突。作者可能没有理解你的问题(因为他们可能不是以英语为母语的人),或者可能只是很忙。或者他们只是认为他们的问题很好,不需要澄清,因为已经有了答案。谁知道呢。无论如何,感谢您的编辑,如果有什么事情发生的话,我们将拭目以待。@HereticMonkey抱歉,我不是母语人士,但@PatrickRoberts是对的,Object.seal()
和Object.freeze()
也使[[prototype]]不可变。如果你对清晰(和精确)的版本有任何想法,请告诉我,我会编辑。谢谢你,兄弟,只留下了一个困惑,我们在其[[原型]]上添加的方法是正确的吗?