有一个对象,是观察者,它用于观察另外一个对象的属性值变化,当属性值变化后会收到一个通知,可能会做一些事。

使用Object.defineProperty实现

  1. <div id="container">
  2. </div>
  3. <script>
  4. //创建一个观察者
  5. function observer(target) {
  6. const div = document.getElementById("container");
  7. const ob = {};
  8. const props = Object.keys(target);
  9. for (const prop of props) {
  10. Object.defineProperty(ob, prop, {
  11. get() {
  12. return target[prop];
  13. },
  14. set(val) {
  15. target[prop] = val;
  16. render();
  17. },
  18. enumerable: true
  19. })
  20. }
  21. render();
  22. function render() {
  23. let html = "";
  24. for (const prop of Object.keys(ob)) {
  25. html += `
  26. <p><span>${prop}:</span><span>${ob[prop]}</span></p>
  27. `;
  28. }
  29. div.innerHTML = html;
  30. }
  31. return ob;
  32. }
  33. const target = {
  34. a: 1,
  35. b: 2
  36. }
  37. const obj = observer(target)
  38. </script>

使用 Proxy

  1. <div id="container">
  2. </div>
  3. <script>
  4. //创建一个观察者
  5. function observer(target) {
  6. const div = document.getElementById("container");
  7. const proxy = new Proxy(target, {
  8. set(target, prop, value) {
  9. Reflect.set(target, prop, value);
  10. render();
  11. },
  12. get(target, prop){
  13. return Reflect.get(target, prop);
  14. }
  15. })
  16. render();
  17. function render() {
  18. let html = "";
  19. for (const prop of Object.keys(target)) {
  20. html += `
  21. <p><span>${prop}:</span><span>${target[prop]}</span></p>
  22. `;
  23. }
  24. div.innerHTML = html;
  25. }
  26. return proxy;
  27. }
  28. const target = {
  29. a: 1,
  30. b: 2
  31. }
  32. const obj = observer(target)
  33. </script>