阮一峰ES 6教程読書ノート(13)Reflect対象
4047 ワード
Reflectオブジェクト
About
勉強が進むにつれて、私は徐々に
1.Reflect概要
1.1簡略化
ES 2015から、
1.2
以前は、
1.3
1.4と
2.静的方法
2.1 get(target,name,recevier)
2.2 set(target,name,value,receiver)
この方法は
作者:阮一峰
リンク:http://es6.ruanyifeng.com/#docs/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
オブジェクトで読み取られたprop
にsetter
方法がある場合、setter
のthis
をreveiver
に結び付けることができる.2.2 set(target,name,value,receiver)
Reflect.set()
方法は、target
オブジェクトのname
属性の値をvalue
とし、name
の属性がsetter
として設定されている場合、setter
のthis
はrceivr
と結合される.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