紹介を反映してください:
反射オブジェクトは私のノード(v4.4.3)に実装されておらず、Babel(6.7.7)は実装されていません。 Chromeの新しいバージョンがサポートされています。 FFはプロキシをサポートし、長い間反映しています。ノードをサポートしたい場合は、ハーモニー反射をインストールできます。
反射はコンストラクターではありません。使用すると、resprem.method()を介して直接呼び出されます。反射のいくつかの方法はプロキシに似ており、ほとんどの反射方法ネイティブオブジェクトが再実装されています。
使用するものは反射します
Reflectが使用される理由がいくつかあります。翻訳アドレス:反映、大まかに翻訳:
1:より便利な返品値:Reflectには、ES5のオブジェクトメソッドのようないくつかのメソッドがあります。ただし、object.defineProperty(OBJ、name、desc)が正常に実行されると、OBJやその他の理由が原因となります。 riffer.definePropertyは、オブジェクトのプロパティが設定されているかどうかを示すために、falseまたはtrueのみを返します。次のコードをリファクタリングできます。
try {object.defineProperty(obj、name、desc); //プロパティが定義されて定義されている} catch(e){//誤って間違った例外をキャッチする可能性がある)}このように再構築されました:
if(refrect.defineProperty(obj、name、desc)){// success} else {// fails}Relect.set、riffer.deleteproperty、rfrect.preventextensions、rfrect.setprototypeofなどの他の方法は、すべてリファクタリングできます。
2:関数操作。 OBJが属性名を定義または継承していることを判断したい場合は、このようにES5で判断できます。OBJの名前。
または属性を削除する:obj [name]を削除します。これらは非常に便利で、非常に短く、明確ですが、使用する場合はクラスにカプセル化する必要があります。
反映を使用すると、カプセル化するのに役立ちます。
3:より信頼性の高い機能実行方法:ESでは、関数fを実行してパラメーターのセットをそれに渡し、これにバインドする場合は、これを書く必要があります。
f.apply(obj、args)
ただし、Fアプリケーションはユーザー独自のアプリケーションとして再定義される可能性があるため、この方法で作成する方が信頼できます。
function.prototype.apply.call(f、obj、args)
上記のコードは長すぎて理解するのが難しいです。反映すれば、私たちはより短く、より簡潔でより明確になることができます:
refrect.apply(f、obj、args)
4:Variadicパラメーター形式のコンストラクター:不確実な長さのパラメーターを介してコンストラクターをインスタンス化することを想像してください。 ES5では、拡張シンボルを使用できます。これは次のように書くことができます。
var obj = new f(... args)
ただし、ES5では、拡張文字はサポートされていないため、F.ApplyまたはF.Callで異なるパラメーターのみを渡すことができます。残念ながら、fは詐欺であるコンストラクターですが、反映して、
これをES5で書くことができます:
var obj = reflect.construct(f、args)
5:これにより、アクセサまたはリーダーが制御されます。ES5では、要素の属性を読みたい場合、または属性を次のように設定する場合:
var name = ... // Stringobjとしてプロパティ名を取得[name] // generic Property lookupobj [name] = value // genericプロパティ
updatereflect.get.get.set.setメソッドが同じことを行うことを可能にし、リサイバーに追加のパラメーターを追加し、オブジェクトのセッターとゲッターを上下に設定できるようにします。
var name = ... //プロパティ名をStringRefflect.get(OBJ、name、wrapper)// obj [name]がアクセサである場合、「this === wrapper`reflect.set.set(obj、name、value、wrapper)で実行されます。 }、bar:function(){alert(1);}}; var wrapper = {bar:function(){console.log( "wrapper");}}6:__Proto__への直接アクセスを避けてください:
ES5はobject.getPrototypeof(OBJ)を提供してオブジェクトのプロトタイプにアクセスし、ES6も提供します
Reflect.getPrototypeof(OBJ)およびRefrom.setPrototypeof(OBJ、NewProto)、これはオブジェクトのプロトタイプにアクセスして設定する新しい方法です。
refrict.apply usage
refrect.applyは実際にはfunction.prototype.apply()es5の代替です。 Reflect.Applyを実行するには、3つのパラメーターが必要です。
最初のパラメーターは次のとおりです。実行する関数。
2番目のパラメーターは次のとおりです。これを実行する必要があるコンテキスト。
3番目のパラメーターは次のとおりです。アレイまたは擬似アレイで、関数を実行するパラメーターとして使用されます。
<script> let fn = function(){this.attr = [0,1,2,3];}; let obj = {}; refrect.apply(fn、obj、[])console.log(obj); <script> refrect.apply:<script> refrect.apply(math.floor、undefined、[1.75]); // output:1; refrect.Apply(String.FromCharcode、未定義、[104、101、108、108、111]); // output: "hello" refrect.apply(regexp.prototype.exec、/ab/、["confabulation"])。index; // output:4Reflect.Apply( ""。Charat、 "Ponies"、[3]); // output: "i" </script>反射はプロキシと組み合わせて使用できます:{var fn = function(){}; fn.prototype.run = function(){console.log( "runs of");}; var proxyfn = new proxy(fn、{construmberts、argments、aorgments constultor.log ")ターゲット(...アリューガン); // refrect.apply; refrect.apply(target.prototype.run、obj、arugments); return obj;}}); new proxyfn(); //最初に出力:「プロキシコンストラクター」;そして、出力:実行} refrect.construct():refrect.constructは実際にインスタンス化コンストラクターです。引数フォームを介して実装されます。実行方法は異なります。効果は実際に同じです。コンストラクトの最初のパラメーターはコンストラクターであり、2番目のパラメーターはパラメーターで構成される配列または擬似アレイです。基本的な使用方法は次のとおりです。varfn = function(arg){this.args = [arg]}; console.log(new fn(1)、resprec.construct(fn、[1])); //出力は同じvar d = riffer.construct(date、[1776、6、4]); d instanceof date; // trued.getFullyear(); // 1776 // so refrect.construct and new constructs so refrect.constructとnew constructは同じです。少なくともこれまでのところ、3番目のパラメーターを渡すことができます。construct、3番目のパラメーターはスーパークラスです。新しい要素はこのスーパークラスを継承します。 <script> function someconstructor(){} var result = reflect.construct(array、[]、someconstuctor); rflect.getPrototypeof(result); // someconstructor.prototypearray.isarray(result); // true // orvar fn = function(){this.attr = [1];}; var person = function(){}; person.prototype.run = function(){}; console.log(refrect.construct(fn、[]、person)); </script>これを使用するために、アレイを使用するためにこれを使用できます。 var fn = function(){array.apply(this、arguments); this.shot =()=> {console.log( "heheda");};}; var arr = riffmer.construct(fn、[])refrect.defineProperty; Reflect.DefinePropertyはブール値を返し、属性値は直接割り当てによってオブジェクトに追加されます。追加が失敗した場合、オブジェクト全体を返します。エラーがスローされます。 var obj = {}; obj.x = 10; console.log(obj.x)// output:10; resprem.definePropertyを使用して値を追加します。 <scrip> var obj = {}; if(refferm(refrect.defineProperty(obj、 "x"、{value:7})){console.log( "add success");} else {console.log( "add success");}; </script> prepretextensを介して誤りを明記している場合は、誤りを明記している場合、誤りを明記している場合、誤っていることを報告します。 Reflect.defineProperty、およびfalse値が返されます:var obj = {}; object.preventextensions(obj); object.defineproperty(obj、 "x"、{value:101、wrible:enumerable:false、configurable:false}); console.log(refrect.defineProperty(obj、 "x"、{value:101}))// false:値が直接割り当てられている場合、オブジェクトのプロパティ値が正常に設定されているかどうかを手動で確認しない限り、値が正しく割り当てられているかどうかに関係なく、セット値が正しく割り当てられているかどうかに関係なく返品されます。 <Script> var obj = {}; object.preventextensions(obj); console.log(obj.aa = 1); //出力:1; console.log(obj.aa)// output:undefined; </script> refrect.deletepropertyの使用:refrect.deletepropertyおよびresprec.definePropertyの使用は類似しています。 resprem.deletepropertyおよび削除obj.xxの操作結果は同じです。違いは、使用フォームが異なることです。1つはオペレーターであり、もう1つは関数呼び出しです。 resprem.deleteproperty(object.freeze({foo:1})、 "foo"); // falsedelete object.freeze({foo:1})。foo; //出力:false; Reflect.get()メソッドを使用するための2つの必要なパラメーターがあります。1つ目はOBJターゲットオブジェクト、2番目は属性名オブジェクト、3番目はオプションであり、これは読者のコンテキストです(this)。 var obj = {}; obj.foo = 1; console.log(obj.foo); // output:1; console.log(refrect.get(obj、 "foo"))// output:1; refrect.getに3番目のパラメーターがある場合、3番目のパラメーターは読者のコンテキストとして使用されます:var refrect = reques( 'harmony-refltef'); var obj = {"foo":1、get bar(){this.foo;}} refrect.getownPropertyDescriptor({x: "hello"}、 "x"); //このようにすることもできます:object.getownPropertyDescriptor({x: "1"}、 "x"); //例外object.getownPropertyDescriptor( "hello"、0); // output:{value: "h"、writable:false、列挙可能:true、configureable:false} riffer.getPrototypeof()メソッド使用:refrect.getPrototypeofおよびobject.getPrototypeofは同じです。 // output:object.prototypereflect.getPrototypeof(object.prototype); // output:nullreflect.getPrototypeof(object.create(null)); // output:nullReflect.has resprem.hasを使用する方法は演算子に少し似ています。 refrect.has({y:0}、 "y")// output:true; var obj = {x:0}; console.log( "x" in obj); var proxy = new proxy(obj、{has:function(target、args){console.log( "execute has hads"); return refrect.has(target、... args);}}); console.log( "x" in proxy); //出力:true; console.log(refrect.has(proxy、 "x"))// output:true; </script>このデモのobjはメソッドになるのと同等であり、役に立たず、obj = new proxy({}、{has(t、k){return k.startswith( "door");}}); refrect.has(obj、 "doorbell"); // truereflect.has(obj、 "dormitory"); // falsereflect.isextensible()use //この要素を拡張できるようになりました。 var empty = {}; resprem.isextensible(empty); // === true // preventextensionsメソッドを使用して、このオブジェクトが新しい属性を拡張しないようにします。 refrect.preventextensions(empty); riflect.isextensible(empty); // === false //このオブジェクトは新しい属性を拡張できず、書き込み可能な属性を変更できますvar sealed = object.seal({}); reflect.isextensible(sealed); // === false //このオブジェクトは完全に冷凍されていますvar frozen = object.freeze({}); rflect.isextensible(frozen); // === false resprem.isextensible.sextensibleの違いは、パラメーターが正しくない場合、1つが間違ったものをスローし、もう一方がtrueまたはfalse:isextensible(1); //間違ったスロー:1はObjectObject.isextensible(1); // return false; REFRICE.OWNKEYS()メソッドの使用:refrect.Ownkeys、オブジェクトには独自のキーのメソッドがありません。 console.log(refrect.ownkeys({"a":0、 "b":1、 "c":2、 "d":3})); // output:["a"、 "b"、 "c"、 "d"] console.log(refrect.ownkeys([])); // ["length"] var sym = symbol.for( "comet"); var sym2 = symbol.for( "meteor"); var obj = {[sym]:0、 "str":0、 "773":0、 "0":0、[sym2]:0、 "-1":0、 "8":0、 "second str":0}; reflect.ownkeys(obj); // output: /["0"、 "8"、 "773"、 "str"、 "-1"、 "2番目のstr"、シンボル(comet)、symbol(meteor)] reflect.ownkeysは次のようにソートされます。最後に、シンボルタイプのキーも挿入の順序に従ってソートされます。ソートは、オブジェクト属性に値を割り当てると、オブジェクトキーのソートルールが最初の番号、文字列、最後にシンボルタイプのデータであるためです。 riffer.preventextensions()の使用方法():オブジェクトには、rifferm.preventextensions()とは少し異なります。 Reflect.Preventextensionsパラメーターがオブジェクトではない場合、エラーが発生します。 var empty = {}; resprem.isextensible(empty); // === true //オブジェクトを実行した後のオブジェクトは変更できます。 refrect.preventextensions(empty); riflect.isextensible(empty); // === falsereflect.preventextensions(1); // typeRror:1はobjectObject.preventextensions(1); //エラーがスローされない場合、return:1reflect.set()refferm.setメソッドはgetに似ています。 var obj = {}; reflect.set(obj、 "prop"、 "value"); // output:trueconsole.log(obj.prop); // output: "value" var arr = ["duck"、 "duck"、 "duck"]; refrect.set(arr、2、 "goose"); // trueconsole.log(arr [2]); // "Goose" reflect.set(arr、 "length"、1); // trueconsole.log(arr); // ["duck"]; reflect.set(obj)はrefrect.set(obj、undefined、undefined); var obj = {}; reflect.set(obj); // output:true //上記のコードはrefrect.set(obj、undefined、undefined); resprem.getownpropertydescriptor(obj、 "undefined"); // {value:undefined、writable:true、列挙、列挙、真、構成:真:true} set; key(value){console.log( "setter"); this.value = value;}、get key(){return this.value;}}; set(obj、 "key"、 "heheda"、obj); console.log(obj); refrect.setprototopeofオブジェクトのプロトタイプを設定します。これは、オブジェクトの__proto__属性を変更することです。 // true //オブジェクトアレイへの出力[[[prototype]]はnull.reflect.setPrototypeof({}、null); // true //この時点で、obj .__ proto__はオブジェクトを解放してリセット[[prototype]] refrect.setprototypeof(object.freeze({})、null); // false //プロトタイプチェーンがループに依存している場合、false.varターゲット= {}; var proto = object.create(ターゲット); refrect.setprototypeof(ターゲット、proto); // 間違い