7

“内部”是指在ES5 8.6.2中定义的那些:

http://www.ecma-international.org/publications/standards/Ecma-262.htm

可以通过使用访问[[Class]]内部属性

Object.prototype.toString(Object) 

这些属性的用途是什么,是否可以访问?

该规范并未声称定义修改(p32-footer)的方法。

注意 本规范没有定义允许程序修改对象的 [[Class]] 或 [[Prototype]] 内部属性或将 [[Extensible]] 的值从 false 更改为 true 的 ECMAScript 语言运算符或内置函数。修改 [[Class]]、[[Prototype]] 或 [[Extensible]] 的实现特定扩展不得违反前一段中定义的不变量。

4

2 回答 2

8

它们可以访问吗?

不完全是,您可以弄清楚它们返回的内容(基于它们各自的定义§8.12),但您无法更改它们的工作方式。

以下是解决其中大部分问题的方法(列在§8.6.2中)。对于所有示例,我假设对象存储为obj并且属性键是name,val是一个值并且descriptor是一个属性描述符。

这些属性有什么用?

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


ES6+

在 ES6 中,我们可以访问Proxys,这意味着我们可以创建对象,然后用 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)
于 2013-01-16T23:12:21.073 回答
-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]] 和 [[Delete]] -- 如果你知道,请详细说明。

于 2014-09-10T19:14:43.913 回答