6.1.7.3 基本内部方法的不变量[[OwnPropertyKeys]] ( )
ECMAScript 引擎的对象的内部方法必须符合下面指定的不变式列表。 普通ECMAScript对象以及本规范中的所有标准异常对象都保持这些不变量。 ECMAScript Proxy 对象通过运行时检查在 [[ProxyHandler]] 对象上调用的陷阱的结果来维护这些不变量。
任何实现提供外来对象也必须保持这些对象的这些不变量。 违反这些不变式可能导致 ECMAScript 代码具有不可预测的行为并出现安全问题。 然而,违反这些不变式必须绝不损害实现的内存安全性。
内置系统不允许任何方式规避这些不变量,例如通过提供实现基本内部方法的功能而不强制其不变量的替代接口。
Definitions:
内部方法的目标是调用内部方法的对象。
如果已经观察到目标从其 [[IsExtensible]] 内部方法返回 false,或者从其 [[PreventExtensions]] 内部方法返回true,那么目标是不可扩展的。
不存在的属性是不能用做不可扩展目标上的自身属性上存在的属性。
对 SameValue 的所有引用都是根据 SameValue 算法定义。
[[GetPrototypeOf]] ( )
返回值的类型必须是 Object 或Null。
如果 target 是不可扩展的,并且 [[GetPrototypeOf]] 返回一个值 v,那么任何对 [[GetPrototypeOf]] 的调用都应该返回与 v 一样的 SameValue。
注意1:对象的原型链应该具有有限的长度(即,从任何对象开始,递归地应用 [[GetPrototypeOf]] 内部方法到它的结果应该最终导致值 null)。 然而,如果原型链包括不使用 [[GetPrototypeOf]] 的普通对象定义的异常对象,则该要求不能作为对象级不变量强制执行。 这样的循环原型链可能在访问对象属性时导致无限循环。
[[SetPrototypeOf]] (V)
返回值的类型必须为 Boolean 值。
如果 target 是不可扩展的,[[SetPrototypeOf]] 必须返回 false,除非 V 是与目标观察到的 [[GetPrototypeOf]] 值是相同的 SameValue。
[[IsExtensible]] ( )
返回值的类型必须为 Boolean 值。
如果 [[IsExtensible]] 返回 false,则对目标上的 [[IsExtensible]] 的所有未来调用都必须返回 false。
[[PreventExtensions]] ( )
返回值的类型必须为 Boolean 值。
如果 [[PreventExtensions]] 返回 true,则目标上对 [[IsExtensible]] 的所有未来调用都必须返回 false,并且目标被认为不可扩展。
[[GetOwnProperty]] (P)
返回值的类型必须是属性描述符或 Undefined。
如果返回值的类型是属性描述符,则返回值必须是完整的属性描述符(见 6.2.4.6)。
如果属性 P 被描述为具有Desc 的 v 。[[Value]] 等同于 v 和 Desc。[[Writable]] 和 Desc。[[Configurable]] 都是 false,那么在对[[GetOwnProperty]](P)的所有未来调用时必须返回属性的 Desc。[[Value]] 属性的 SameValue。
如果除了 [[Writable]] 之外的P的属性可能随时间改变或者属性可能消失,则 P 的 [[Configurable]] 属性必须为 true。
如果 [[Writable]] 属性可能从 false 更改为 true,则 [[Configurable]] 属性必须为true。
如果目标是不可扩展的并且 P 不存在,那么目标上对 [[GetOwnProperty]](P)的所有未来调用必须将 P 描述为不存在(即[[GetOwnProperty]](P)必须返回 Undefined )。
注意2:作为第三不变量的结果,如果属性被描述为数据属性并且它可以随时间返回不同的值,则 Desc。[[Writable]] 和 Desc。[[Configurable]] 属性中的任一个或两者必须是 即使没有通过其他内部方法暴露出改变值的机制。
[[DefineOwnProperty]] (P, Desc)
返回值的类型必须为 Boolean 值。
[[DefineOwnProperty]](P,Desc)必须返回false,如果P先前已被观察为目标的不可配置的自身属性,除非:
1.P 是不可配置的可写自有数据属性。 不可配置的可写数据属性可以改变为不可配置的不可写数据属性。
2.Desc 中的所有属性都是 P 的属性的 SameValue。
- [[DefineOwnProperty]](P,Desc)必须返回false,如果目标是不可扩展的,并且P是不存在的属性。 也就是说,不可扩展的目标对象不能用新的属性扩展。
[[HasProperty]] ( P )
返回值的类型必须为 Boolean 值。
如果先前观察到 P 是目标的不可配置数据或访问者自己的属性,则 [[HasProperty]] 必须返回true。
[[Get]] (P, Receiver)
如果先前观察到 P 是具有值 v 的目标的不可配置的,不可写的自身数据属性,则 [[Get]] 必须返回 SameValue。
如果先前观察到 P 是其 [[Get]] 属性未定义的目标的不可配置自身的评估者属性,则 [[Get]]操作必须返回 Undefined。
[[Set]] ( P, V, Receiver)
返回值的类型必须为 Boolean 值。
如果先前观察到 P 是目标的不可配置的,不可写的自己的数据属性,则 [[Set]] 必须返回 false,除非 V 是 SameValue 作为 P 的[[Value]] 属性。
如果 P 之前被观察为其 [[Set]] 属性未定义的目标的不可配置自身的评估者属性,则 [[Set]] 操作必须返回 false。
[[Delete]] ( P )
返回值的类型必须为 Boolean 值。
如果先前观察到 P 是目标的不可配置的自身数据或访问器属性,则 [[Delete]] 必须返回 false。
[[OwnPropertyKeys]] ( )
返回值一定是一个列表(List)。
返回的 List 的每个元素的类型是 String 或 Symbol。
返回的列表必须至少包含以前观察到的所有不可配置的属性的键。
如果对象是不可扩展的,则返回的 List 必须只包含使用 [[GetOwnProperty]] 可观察到的对象的所有属性的键。
[[Construct]] ( )
- 返回值的类型必须为 Object。