阮一峰ES 6教程読書ノート(13)Reflect対象

4047 ワード

Reflectオブジェクト
About
勉強が進むにつれて、私は徐々にJavaScriptに対してよりマクロ的な認識を持ちました.前に仕事で出会ったいくつかの問題も説明されました.勉強はこのようにして、ミクロからマクロまで、いつか私はJavascriptのアーキテクチャを食べて、頑張ってください.
1.Reflect概要Reflectオブジェクトは、Proxyオブジェクトと同様に、ES 6がオブジェクトを操作するために提供される新しいAPIである.Reflectの設計目的については、大体四つの点に分けられると思います.
1.1簡略化Objectオブジェクト
ES 2015から、Javascriptのアーキテクチャは、いくつかの大域的な方法を専門的なオブジェクトに配置し、Reflectのオブジェクトのように、以前Objectに属していた静的な方法の大部分をReflectペアに移植するように、より明確に構成されており、以後、Objectは構成関数の責任だけを負うことができる.すなわち、Objectには例示的な方法だけがあり、より多くの動作対象の方法を専用のオブジェクトReflectに展開する.
1.2 Object静的方法を変更する行為
以前は、Objectの静的方法の挙動は統一しにくいものではなく、リターン値があり、リターン値がないものもあり、オブジェクトのインスタンスを返すものもあり、またブール値を返すものもあります.
var a = {}

Object.setPrototypeOf(a, Array.prototype) // Array {}
Reflect.setPrototypeOf(a, Object.prototype) // true

Object.setPrototypeOf(1, Array.prototype) // 1
Reflect.setPrototypeOf(1, Object.prototype) // Uncaught TypeError

Reflect.setPrototypeOf(Object.freeze(a), Array.prototype) // false
上記のコードを通して、Object.setPrototypeOfはいつも最初のパラメータに戻ります.操作が成功したかそれとも失敗したかは分かりません.合法ですか?それとも不法ですか?しかし、Reflect.setPrototypeOfは違っています.成功か失敗かを伝えるためにブール値を返します.私たちはif...elseを使って違った動作をすることができます.
1.3 Objctの動作をすべて関数的な動作にするReflectオブジェクトの方法は、いずれも関数的な動作であり、すなわちパラメータを受け取り、リターン値があるが、Objectは異なる.
var a = {
    name: 'bing'
}

delete a.name // true
Reflect.deleteProperty(a, 'name') //true
関数的な操作になったら、プログラミングのスタイルがより厳密になります.
1.4とProxyは一対一で対応しています.Reflectオブジェクトの方法は、Proxyオブジェクトの方法に対応しており、Proxyオブジェクトの方法であれば、Reflectオブジェクトに対応する方法を見つけることができる.これにより、Proxyオブジェクトは、対応するReflect方法を容易に呼び出し、デフォルト動作を修正挙動の基礎として完成させることができる.つまり、Proxyがどのようにデフォルト行動を修正しても、Reflect上でデフォルト行動を取得することができる.
2.静的方法Reflectの大部分はObjectオブジェクトと同名の方法の役割は同じであり、Proxyオブジェクトとの方法は1つに対応している.ここにはいくつかの一般的な記録しかありません.もっと多くの方法は原作を参照してください.
2.1 get(target,name,recevier)Reflect.get方法でtargetオブジェクトのname属性を検索して返します.属性がない場合はundefinedに戻ります.
var myObject = {
  foo: 1,
  bar: 2,
  get baz() {
    return this.foo + this.bar;
  },
}

Reflect.get(myObject, 'foo') // 1
Reflect.get(myObject, 'bar') // 2
Reflect.get(myObject, 'baz') // 3
get方法で受け入れられた第3のパラメータreceiverは、targetオブジェクトで読み取られたpropsetter方法がある場合、setterthisreveiverに結び付けることができる.
2.2 set(target,name,value,receiver)Reflect.set()方法は、targetオブジェクトのname属性の値をvalueとし、nameの属性がsetterとして設定されている場合、setterthisrceivrと結合される.
var myObject = {
  foo: 4,
  set bar(value) {
    return this.foo = value;
  },
};

var myReceiverObject = {
  foo: 0,
};

Reflect.set(myObject, 'bar', 1, myReceiverObject);
myObject.foo // 4
myReceiverObject.foo // 1
2.3 has(obj,name)
この方法はin演算子に相当する.
var myObject = {
  foo: 1,
};

//    
'foo' in myObject // true

//    
Reflect.has(myObject, 'foo') // true
2.4 defineProfity(target,name,atriDescObj)Reflect.defineProperty方法は、基本的にはObject.definePropertyと同等であり、オブジェクトの属性を定義するために用いられる.今後、後者は徐々に廃止されますので、これから代わりにReflect.definePropertyを使ってください.
function MyDate() {
  /*…*/
}

//    
Object.defineProperty(MyDate, 'now', {
  value: () => Date.now()
});

//    
Reflect.defineProperty(MyDate, 'now', {
  value: () => Date.now()
});
参照リンク
作者:阮一峰
リンク:http://es6.ruanyifeng.com/#docs/reflect