Что такое шаблон наблюдателя
ВикипедияШаблон наблюдателя определяется следующим образом:
Паттерн Наблюдатель — это один из паттернов проектирования программного обеспечения. В этом шаблоне целевой объект управляет всеми зависимыми от него объектами-наблюдателями и активно уведомляется об изменении своего состояния. Обычно это достигается путем вызова методов, предоставляемых каждым наблюдателем. Этот шаблон часто используется в системах обработки событий в реальном времени.
Проще говоря, при изменении данных автоматически выполняется соответствующая функция обработки. Определение вики включает в себя активное уведомление, Таким образом, трансляция событий в angularJS более удовлетворительна, но ее недостаток заключается в плохой ремонтопригодности кода. Тот же эффект может быть достигнут, если соответствующая функция обработки вызывается при установке значения атрибута объекта вместо активного уведомления. Подробный код смотрите ниже.
Реализация под ES5
В ES5 в основном черезObject.definePropertyМетод определяет настройку и получение свойств объекта, а также выполняет соответствующие функции обработки при настройке.Пример кода следующий:
// 创建对象
var targetObj = {
age: 1
}
// 定义值改变时的处理函数
function observer(oldVal, newVal) {
// 其他处理逻辑...
console.info('name属性的值从 '+ oldVal +' 改变为 ' + newVal);
}
// 定义name属性及其set和get方法
Object.defineProperty(targetObj, 'name', {
enumerable: true,
configurable: true,
get: function() {
return name;
},
set: function(val) {
//调用处理函数
observer(name, val)
name = val;
}
});
targetObj.name = 'Martin';
targetObj.name = 'Lucas';
console.info('targetObj:', targetObj)
Выход
...
name属性的值从 Martin 改变为 Lucas
targetObj: {age: 1, name: 'Lucas'}
...
Внедрение ES6
Используйте метод set для достижения
class TargetObj {
constructor(age, name) {
this.name = name;
this.age = age;
}
set name(val) {
observer(name, val);
name = val;
}
}
let targetObj = new TargetObj(1, 'Martin');
// 定义值改变时的处理函数
function observer(oldVal, newVal) {
// 其他处理逻辑...
console.info('name属性的值从 '+ oldVal +' 改变为 ' + newVal);
}
targetObj.name = 'Lucas';
console.info(targetObj)
Выход
...
name属性的值从 Martin 改变为 Lucas
targetObj: {age: 1, name: 'Lucas'}
...
Реализовано с использованием Reflect и Proxy
Новый Proxy Api в ES6 имеет множество применений. В сочетании с Reflect Api он может легко реализовать множество мощных логических функций. Подробнее см.«Введение в ECMAScript 6» — Руан Ифэнвведение в . Код реализации выглядит следующим образом:
class TargetObj {
constructor(age, name) {
this.name = name;
this.age = age;
}
}
let targetObj = new TargetObj(1, 'Martin');
let observerProxy = new Proxy(targetObj, {
set(target, property, value, reciever) {
if (property === 'name') {
observer(target[property], value);
}
Reflect.set(target, property, value, reciever);
}
});
// 定义值改变时的处理函数
function observer(oldVal, newVal) {
// 其他处理逻辑...
console.info(`name属性的值从 ${oldVal} 改变为 ${newVal}`);
}
observerProxy.name = 'Lucas';
console.info(targetObj);
Выход
...
name属性的值从 Martin 改变为 Lucas
targetObj: {age: 1, name: 'Lucas'}
...
Суммировать
- ES6 Многие новые функции, эффективны для повышения эффективности и самой рациональности JS
- Хотя многие базовые методы и концепции редко используются в бизнес-реализации, понимание их концепций оказывает большое влияние на идеи кодирования.
- Шаблон наблюдателя вполне может завершить взаимодействие между данными.Хотя он часто используется, он обеспечивает более глубокое понимание общей структуры и принципов после детального понимания.
- Прокси действительно хороший и мощный