它们可以访问吗?
不完全是,您可以弄清楚它们返回的内容(基于它们各自的定义§8.12),但您无法更改它们的工作方式。
以下是解决其中大部分问题的方法(列在§8.6.2中)。对于所有示例,我假设对象存储为obj
并且属性键是name
,val
是一个值并且descriptor
是一个属性描述符。
[[Prototype]]
,Object.getPrototypeOf(obj)
[[Class]]
,Object.prototype.toString.call(obj)
[[Extensible]]
,Object.isExtensible(obj)
[[Get]]
,obj[name]
[[GetOwnProperty]]
,Object.getOwnPropertyDescriptor(obj, name)
[[GetProperty]]
,Object.getOwnPropertyDescriptor(obj, name)
结合向上继承 ( Object.getPrototypeOf
)
[[Put]]
,obj[name] = val
[[CanPut]]
,查找getOwnPropertyDescriptor
,如果undefined是obj
可扩展的(Object.isExtensible
)?否则,检查setter set的可写或存在
[[HasProperty]]
,name in obj
[[Delete]]
,delete obj.name
[[DefaultValue]]
,不确定这个
[[DefineOwnProperty]]
,Object.defineProperty(obj, name, descriptor)
这些属性有什么用?
它们与 JavaScript 引擎应如何根据规范(第 8.12 节)工作的内部机制有关,并在算法(示例)中被引用。
ES6+
在 ES6 中,我们可以访问Proxy
s,这意味着我们可以创建对象,然后用 a 包装它们,Proxy
让我们以自定义方式处理 get、set、has 等
// have some object
let o = {};
// wrap with proxy defining a get handler and set handler
let p = new Proxy(o, {
get(t, n) {
console.log(t, n, t[n]);
return t[n];
},
set(t, n, v) {
t[n] = +v;
return true;
}
});
// now accessing via proxy
p.foo; // undefined
// get handler logs Object o, "foo", undefined (this happens before .foo returns)
p.foo = '123'; // uses handler to sets on `o`
p.foo; // 123, notice value is Number due to set handler
// get handler logs Object o, "foo", 123 (this happens before .foo returns)