“内部”是指 ES5 8.6.2 :
中定义的内容http://www.ecma-international.org/publications/standards/Ecma-262.htm
可以使用
访问 [[Class]] 内部属性Object.prototype.toString(Object)
这些属性是什么?可以访问吗?
规范并未声明定义修改方法(p32-footer)。
注意该规范没有定义ECMAScript语言运算符或 允许程序修改对象的内置函数 [[Class]]或[[Prototype]]内部属性或更改值 [[可扩展]]从虚假到真实。具体实施 必须修改[[Class]],[[Prototype]]或[[Extensible]]的扩展名 不违反前一段规定的不变量。
答案 0 :(得分:8)
可以访问吗?
不完全是,你可以弄清楚他们返回的内容(基于他们的个人定义§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
,如果未定义是obj
可扩展的(Object.isExtensible
)?否则,请检查可写或存在setter set [[HasProperty]]
,name in obj
[[Delete]]
,delete obj.name
[[DefaultValue]]
,不确定这个[[DefineOwnProperty]]
,Object.defineProperty(obj, name, descriptor)
这些属性是什么?
它们与JavaScript引擎应如何根据规范(§8.12)工作的内部机制有关,并在算法(example)中引用。
在ES6中,我们可以访问Proxy
,这意味着我们可以创建对象,然后使用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)
答案 1 :(得分:-1)
他们 可访问:
Object.defineProperty({}, 'key', {
get: function(){
console.log('GOT %s', 'key');
return someValue;
},
set: function(value){
console.log('SET %s', 'key');
this[key] = value;
}
});
相当于:
var object = {
_name: '',
get name(){ return this._name; },
set name(value){ this._name = value; }
};
但是,我还不知道如何访问[[Put]]& [[删除]] - 如果你这样做,请详细说明。