是否可以访问ES5-8.6.2中定义的“内部”对象属性?

时间:2013-01-16 22:46:29

标签: javascript

“内部”是指 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]]的扩展名   不违反前一段规定的不变量。

2 个答案:

答案 0 :(得分:8)

  

可以访问吗?

不完全是,你可以弄清楚他们返回的内容(基于他们的个人定义§8.12),但你无法改变他们的工作方式。

以下是解决其中大部分内容的方法(在§8.6.2中列出)。 对于所有示例,我假设对象存储为obj,属性键为nameval为值,descriptor为属性描述符。

  

这些属性是什么?

它们与JavaScript引擎应如何根据规范(§8.12)工作的内部机制有关,并在算法(example)中引用。


ES6 +

在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]]& [[删除]] - 如果你这样做,请详细说明。