Что такое прокси-режим
Шаблон прокси (англ. Proxy Pattern) — это шаблон проектирования в программировании.
Так называемый прокси — это класс, который может действовать как интерфейс к чему-то еще. Прокси может взаимодействовать с чем угодно: сетевыми соединениями, большими объектами в памяти, файлами или другими ресурсами, которые дороги или невозможны для репликации.
Хорошо известным примером шаблона прокси является подсчет ссылок на объекты-указатели.
Когда должно существовать несколько копий сложного объекта, режим прокси можно комбинировать с режимом легковеса, чтобы уменьшить использование памяти. Типичный подход заключается в создании сложного объекта с несколькими прокси, каждый из которых ссылается на исходный сложный объект. Операции на прокси перенаправляются на исходный объект. После удаления всех прокси сложные объекты удаляются.
Выше приведено общее определение режима прокси в Википедии Конкретным проявлением режима прокси в JavaScript является новый объект в ES6 ---Proxy
Что такое прокси-объект
на MDN дляProxy
Объяснение:
Прокси-объекты используются для определения пользовательского поведения для основных операций (таких как поиск свойств, присвоение, перечисление, вызовы функций и т. д.).
Проще говоря:Proxy
Объекты позволяют настроить основные операции всех допустимых объектов в JavaScript. Затем используйте свои пользовательские операции, чтобы переопределить основные операции своих объектов. То есть, когда объект выполняет базовую операцию, он выполняется. Процесс и результат являются вашими собственными, не объект.
😓 Ну, это может быть слишком сложно выразить словами, давайте сразу перейдем к коду.
Во-первых, синтаксис Proxy:
let p = new Proxy(target, handler);
в:
-
target
— это объект, который вы хотите проксировать. Это может быть любой допустимый объект в JavaScript, например: (массив, объект, функция и т. д.) -
handler
представляет собой набор методов работы, которые вы хотите настроить. -
p
это проксированный новый объект, которыйtarget
Все свойства и методы , но его поведение и результаты находятся вhandler
настроен в .
Тогда давайте посмотрим на этот код:
let obj = {
a: 1,
b: 2,
}
const p = new Proxy(obj, {
get(target, key, value) {
if (key === 'c') {
return '我是自定义的一个结果';
} else {
return target[key];
}
},
set(target, key, value) {
if (value === 4) {
target[key] = '我是自定义的一个结果';
} else {
target[key] = value;
}
}
})
console.log(obj.a) // 1
console.log(obj.c) // undefined
console.log(p.a) // 1
console.log(p.c) // 我是自定义的一个结果
obj.name = '李白';
console.log(obj.name); // 李白
obj.age = 4;
console.log(obj.age); // 4
p.name = '李白';
console.log(p.name); // 李白
p.age = 4;
console.log(p.age); // 我是自定义的一个结果
Из приведенного выше кода я это очень ясно вижу.Proxy
Роль объекта, т. е. предыдущаяПользовательское поведение для определения основных операций.такой жеget
а такжеset
Операция.Результатом объекта без прокси является результат, полученный механизмом выполнения собственного JavaScript, выполняющего расчет.Результатом проксированного объекта является наш кастом.
Диапазон, который прокси может проксировать --handler
В приведенном выше коде мы видим, что второй параметр передается при создании прокси-объекта.handler
,этоhandler
объект сделанget
а такжеset
Состоит из двух методов функции. Эти два метода будут использоваться в объектеget
а такжеset
вызывается для выполнения вместо операции над нативным объектом. Так почему же вhandler
,определениеget
а такжеset
После этих двух имен функций вызывается прокси-объектget
а такжеset
Это сработало?
Фактическиhandler
Это объект, недавно разработанный ES6. Его функция заключается в использованииРазличные прокси-операции для пользовательских прокси-объектов.它本身一共有13中方法,每种方法都可以代理一种操作.其13种方法如下:
handler.getPrototypeOf()
// 在读取代理对象的原型时触发该操作,比如在执行 Object.getPrototypeOf(proxy) 时。
handler.setPrototypeOf()
// 在设置代理对象的原型时触发该操作,比如在执行 Object.setPrototypeOf(proxy, null) 时。
handler.isExtensible()
// 在判断一个代理对象是否是可扩展时触发该操作,比如在执行 Object.isExtensible(proxy) 时。
handler.preventExtensions()
// 在让一个代理对象不可扩展时触发该操作,比如在执行 Object.preventExtensions(proxy) 时。
handler.getOwnPropertyDescriptor()
// 在获取代理对象某个属性的属性描述时触发该操作,比如在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。
handler.defineProperty()
// 在定义代理对象某个属性时的属性描述时触发该操作,比如在执行 Object.defineProperty(proxy, "foo", {}) 时。
handler.has()
// 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。
handler.get()
// 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。
handler.set()
// 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。
handler.deleteProperty()
// 在删除代理对象的某个属性时触发该操作,比如在执行 delete proxy.foo 时。
handler.ownKeys()
// 在获取代理对象的所有属性键时触发该操作,比如在执行 Object.getOwnPropertyNames(proxy) 时。
handler.apply()
// 在调用一个目标对象为函数的代理对象时触发该操作,比如在执行 proxy() 时。
handler.construct()
// 在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行new proxy() 时。
ПРОКСИ роль
Для режима проксиProxy
Роль в основном отражается в трех аспектах:
1. Перехватывать и контролировать внешний доступ к объектам
2. Уменьшите сложность функций или классов
2. Проверяйте операции или управляйте необходимыми ресурсами перед сложными операциями.
Чтобы узнать о конкретных характеристиках этих трех аспектов, вы можете обратиться к этой статье:Пример анализа сценариев использования ES6 Proxy
Совместимость с прокси
Выше приведены некоторые из моих поверхностных резюме, надеюсь быть полезным для всех.Если есть какие-то неуместности в тексте, пожалуйста, исправьте, спасибо.
Использованная литература:
Мой личный URL: wangyiming.info