Javaを学んでいたときに学んだので、魔法のようなことは何も感じませんでした。一般的なメソッドを抽出することでした。たとえば、オブジェクトの特定のプロパティを読み取るときは、空白にする必要があります。これはすべて行う必要があります。時間。これはプロキシを使用して実行できます。もちろん、空の場合は退屈です。これは、データベースへの接続や例外の処理が必要なデータベース操作など、より複雑なビジネスロジックを処理するために使用されます。プロキシの使用を検討できます
シンプルな
let person = {
name: "barry"
};
// Proxy对象,第一个参数为被代理的对象,第二个参数事要代理什么
// 这里的get是拦截对象属性读取
let proxy = new Proxy(person, {
get: function(target, property) {
if(target[property]) {
return target[property];
}else {
throw new ReferenceError('Property \"' + property + '\" does not exist.');
}
}
})
console.log(proxy.name);
// 如果没有拦截,这里返回的事undefined
console.log(proxy.age);
"barry"
"error"
"ReferenceError: Property \"age\" does not exist.
at Object.get (hajowoqafe.js:14:13)
at hajowoqafe.js:20:44
at https://static.jsbin.com/js/prod/runner-4.1.7.min.js:1:13924
at https://static.jsbin.com/js/prod/runner-4.1.7.min.js:1:10866"
es6での属性読み取りのインターセプトに加えて、プロキシでサポートされているインターセプト操作には、合計13種類の12種類があります。
- 取得(ターゲット、propKey、レシーバ):のようなオブジェクトプロパティの読み取り切片
proxy.foo
とproxy['foo']
。 - set(target、propKey、value、receiver):
proxy.foo = v
またはなどのオブジェクトプロパティの設定をインターセプトしproxy['foo'] = v
、ブール値を返します。 - has(target、propKey):インターセプトされた
propKey in proxy
操作はブール値を返します。 - deleteProperty(target、propKey):インターセプトされた
delete proxy[propKey]
操作はブール値を返します。 - ownKeys(ターゲット):傍受
Object.getOwnPropertyNames(proxy)
、Object.getOwnPropertySymbols(proxy)
、Object.keys(proxy)
、for...in
サイクルは、配列を返します。このメソッドは、ターゲットオブジェクトのすべての独自の属性の属性名を返します。返されるObject.keys()
結果には、ターゲットオブジェクト自体のトラバース可能な属性のみが含まれます。 - getOwnPropertyDescriptor(target、propKey):
Object.getOwnPropertyDescriptor(proxy, propKey)
プロパティの説明オブジェクトをインターセプトして返します。 - defineProperty(target、propKey、propDesc):切片
Object.defineProperty(proxy, propKey, propDesc)
、Object.defineProperties(proxy, propDescs)
およびブール値を返します。 - PreventExtensions(target):
Object.preventExtensions(proxy)
ブール値をインターセプトして返します。 - getPrototypeOf(target):
Object.getPrototypeOf(proxy)
オブジェクトをインターセプトして返します。 - isExtensible(target):
Object.isExtensible(proxy)
ブール値をインターセプトして返します。 - setPrototypeOf(target、proto):
Object.setPrototypeOf(proxy, proto)
ブール値をインターセプトして返します。ターゲットオブジェクトが関数の場合、インターセプトできる2つの追加操作があります。 - (ターゲット、オブジェクト、引数)適用、例えば、関数呼び出しを傍受するようにプロキシインスタンスを:
proxy(...args)
、proxy.call(object, ...args)
、proxy.apply(...)
。 - construct(target、args):プロキシインスタンスによってコンストラクタとして呼び出される操作のインターセプト
new proxy(...args)
。たとえば。