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、プロパティ キーはnamevalあり、値でdescriptorあり、プロパティ記述子であると想定しています。

これらのプロパティは何のためのものですか?

それらは、仕様 ( §8.12 )に従って JavaScript エンジンがどのように動作するかの内部メカニズムと関係があり、アルゴリズム ( example ) で参照されます。


ES6+

ES6 では s にアクセスProxyできます。これは、オブジェクトを作成し、それらを でラップして、Proxyget、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 に答える