この記事の内容は、ES6 のプロキシとは何ですか? Proxy の詳細な分析は、参考になると思います。
プロキシとは中国語で代理という意味です。この単語は他のプログラミング言語でも同様の意味を持ちます。
プロキシはコンストラクターです。 js のコンストラクターの典型的な特徴は、最初の文字が大文字であることです。新しい Proxy (元のオブジェクト、{proxy list}) 形式でオブジェクトを作成します。作成されたオブジェクトは、プロキシ オブジェクトと呼ばれます。
つまり:
プロキシ オブジェクト = 新しいプロキシ (元のオブジェクト, {プロキシ リスト})
このような追加のプロキシ オブジェクトが生成される理由は、元のオブジェクトを保持できるためです。新しい関数をプロキシ オブジェクトに追加するか、特定の関数を変更します。元のオブジェクトは、適切な時点でロールバックできます。デザインパターンにおけるエージェントパターンと比較して理解することができます。
var obj; var proxyObj = new Proxy(obj, { 对obj的操作1: 函数1, 对obj的操作2: 函数2, ... })
var obj = {name:'fan',age:34} console.info(obj.name) var proxyObj = new Proxy(obj,{ get:function(target,key,receiver){console.info(target,key,receiver); return 'no'} }) console.info(proxyObj.name) console.info(proxyObj.abc)
説明は次のとおりです:
proxy オブジェクトは、obj オブジェクトに基づいて作成された新しいオブジェクトです。
proxyObj.name は、プロキシ オブジェクトの name 属性を取得します。 .オペレーターは自動的に get() メソッド
を呼び出します。これは非常に重要です。 js では、オブジェクトは順序付けされていないプロパティのコレクションです。オブジェクトには属性のみがあり、他には何もありません。たとえば、配列オブジェクト arr の sort メソッド: arr.sort() の呼び出しについてはよく話されます。 object (より厳密には) の場合、sort はオブジェクトの属性です (arr.__proto__)。 length 属性と比較すると、sort 属性の属性値は関数なので、この関数を実行するにはその後に () を追加します。 length 属性は数値なので、() を追加せずにそのまま使用できます。もう一度強調しておきますが、
オブジェクトの操作では get が自動的に呼び出されます。もちろん、普段使っているときにはこのことに気づきません。
エージェント と呼ばれるのですか?
外界 <----> 原对象; 外界 <----> 代理对象 <------> 原对象;
var obj = {name:'fan',age:34} console.info(obj.age) // 34 var proxyObj = new Proxy(obj,{ get:function(target,key,receiver){ console.info(target === obj); //true console.info(receiver === proxyObj); //true if('age' === key){ return target[key] - 5; } else{ return target[key] } } }) console.info(proxyObj.age) // 34- 5 = 29
var arr = [2,1] var proxyArr = new Proxy(arr,{} ) proxyArr.push(3); console.info(arr) // [2,1,3] console.info(arr === proxyArr) // false arr.sort(); console.info(proxyArr[0]) // 1
ただし、注意してください: proxyArr と arr は 2 つの異なるオブジェクトです: arr !== proxyArr。
proxyArr.__proto__ === arr.__proto__ === Array.prototype
var proxyObj = new Proxy(obj, { get: function(tagert,key,receiver){}, set: function(tagert,key,receiver){}, has: function(tagert,key){}, deleteProperty: function(tagert,key){}, ownKeys: function(tagert){}, getOwnPropertyDescriptor: function(tagert,key){}, defineProperty: function(tagert,key,desc){}, preventExtensions: function(tagert){}, getPrototypeOf: function(tagert){}, isExtensible: function(tagert){}, setPrototypeof: function(tagert,proto){}, apply: function(tagert,obj,args){}, construct: function(tagert,args){}, })
var arr = [1,2,3]; console.info(arr[0]) // 1 console.info(arr[-1]) // undefined console.info(arr[100]) // undefined
次のテーブルが範囲外である場合、または負の値がある場合、得られる結果はエラーではなく未定義であることに注意してください。
以下の表に示すように、配列が負の値を取ることができることを期待します。ルールは次のとおりです。
var arr = [1,2,3]; var proxyArr = new Proxy(arr,{ get: (target,prop)=>{ let index = Number(prop); if(index < 0){ prop = target.length + index; } return target[prop]; } }) console.info(arr[-1]); // undefined console.info(proxyArr[-1]); // 3
注:
function myArr(...args){ var arr = new Array(...args); var proxyArr = new Proxy(arr,{ get: (target,key)=>{ let index = Number(key); if(index < 0){ key = target.length + index; } return target[key]; } }) return proxyArr; } var obj = myArr([1,2,3]); console.info(obj[0],obj[-1])
チェーン操作
var double = n => n*2; var pow2 = n => n*n; var half = n => n/ 2; var add1 = n => n+1; function pipe (num){ let funs = [] let obj = new Proxy({},{ get:function(target,prop){ if(prop === 'end'){ return funs.reduce((val,currentfn)=>currentfn(val),num); }else{ funs.push(window[prop]) } return obj; } }) return obj; }; console.info( pipe(4).double.pow2.end); console.info( pipe(4).pow.double.pow2.add1.end);
以上がES6 のプロキシとは何ですか?プロキシの詳細分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。