Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产麻豆91欧美一区二区,亚洲国产高清视频,国产免费久久

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          如何使用Proxy實現(xiàn)JavaScript中的觀察者模式

          軟件開發(fā)中,尤其是JavaScript中,觀察者模式是一種行為設(shè)計模式,它定義了一種一對多的關(guān)系。它允許多個觀察者對象監(jiān)聽一個主題對象,并在主題狀態(tài)發(fā)生變化時自動得到通知。這種模式常用于事件系統(tǒng)、數(shù)據(jù)綁定等場景。

          在JavaScript中,我們可以利用Proxy對象來實現(xiàn)觀察者模式。Proxy對象允許我們攔截和自定義對目標對象的操作,如屬性訪問、賦值、枚舉和函數(shù)調(diào)用。

          本文將逐步講解如何使用Proxy在JavaScript中實現(xiàn)觀察者模式。我們將創(chuàng)建一個觀察者類,定義一個處理程序?qū)ο?,并?chuàng)建一個可觀察對象。此外,我將展示一個常見的前端場景,應(yīng)用我們的Proxy基礎(chǔ)觀察者實現(xiàn)來解決問題。最后,我將對文章內(nèi)容進行總結(jié)。

          1. 什么是觀察者模式?

          觀察者模式是一種設(shè)計模式,其中一個對象(主題)維護一組依賴于它的對象(觀察者),并在其狀態(tài)發(fā)生變化時通知這些觀察者,通常是通過調(diào)用它們的方法。此模式常用于實現(xiàn)分布式事件處理系統(tǒng)。

          2. 使用Proxy實現(xiàn)觀察者模式

          第一步:創(chuàng)建觀察者類

          首先,我們需要創(chuàng)建一個觀察者類,該類將包含添加、刪除和通知觀察者的方法。

          class Observer {
              constructor() {
                  this.observers = [];
              }
          
              addObserver(observer) {
                  this.observers.push(observer);
              }
          
              removeObserver(observer) {
                  this.observers = this.observers.filter(obs => obs !== observer);
              }
          
              notifyObservers(message) {
                  this.observers.forEach(observer => observer.update(message));
              }
          }
          
          class ConcreteObserver {
              update(message) {
                  console.log('Received message:', message);
              }
          }

          在這個例子中,Observer類維護一個觀察者列表,并提供添加、刪除和通知觀察者的方法。ConcreteObserver類是一個具體的觀察者,實現(xiàn)了處理接收通知的update方法。

          第二步:定義處理程序?qū)ο?/strong>

          接下來,我們定義一個處理程序?qū)ο?,以攔截和處理對可觀察對象的操作。

          const handler = {
              set(target, property, value, receiver) {
                  target[property] = value;
                  target.notifyObservers({ property, value });
                  return true;
              }
          };

          在這個例子中,處理程序?qū)ο蟀粋€set方法,用于攔截對可觀察對象的屬性賦值操作。每當可觀察對象的屬性發(fā)生變化時,處理程序?qū)⑼ㄖ杏^察者。

          第三步:創(chuàng)建可觀察對象

          然后,我們創(chuàng)建一個可觀察對象并用Proxy包裝它。

          class Observable extends Observer {
              constructor(target) {
                  super();
                  return new Proxy(target, handler);
              }
          }
          
          const observableObject = new Observable({ name: 'John', age: 30 });

          在這個例子中,Observable類繼承了Observer類,并用Proxy包裝目標對象,以攔截和處理屬性操作。

          3. 在前端場景中應(yīng)用觀察者模式

          接下來,我們將展示如何在一個經(jīng)典的前端數(shù)據(jù)綁定場景中使用Proxy實現(xiàn)觀察者模式。假設(shè)我們有一個簡單的HTML表單,需要實現(xiàn)雙向數(shù)據(jù)綁定。

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>Observer Pattern with Proxy</title>
          </head>
          <body>
              <input type="text" id="nameInput" placeholder="Enter your name">
              <p id="nameDisplay"></p>
              <script>
                  // 觀察者類和具體觀察者類
                  class Observer {
                      constructor() {
                          this.observers = [];
                      }
                      addObserver(observer) {
                          this.observers.push(observer);
                      }
                      removeObserver(observer) {
                          this.observers = this.observers.filter(obs => obs !== observer);
                      }
                      notifyObservers(message) {
                          this.observers.forEach(observer => observer.update(message));
                      }
                  }
                  class ConcreteObserver {
                      constructor(element) {
                          this.element = element;
                      }
                      update(message) {
                          this.element.textContent = message.value;
                      }
                  }
                  // 處理程序?qū)ο?        const handler = {
                      set(target, property, value, receiver) {
                          target[property] = value;
                          target.notifyObservers({ property, value });
                          return true;
                      }
                  };
                  // 可觀察類
                  class Observable extends Observer {
                      constructor(target) {
                          super();
                          return new Proxy(target, handler);
                      }
                  }
                  // 創(chuàng)建可觀察對象
                  const data = new Observable({ name: '' });
                  // 創(chuàng)建具體觀察者
                  const nameDisplayObserver = new ConcreteObserver(document.getElementById('nameDisplay'));
                  data.addObserver(nameDisplayObserver);
                  // 處理輸入更改事件
                  document.getElementById('nameInput').addEventListener('input', (event) => {
                      data.name = event.target.value;
                  });
              </script>
          </body>
          </html>

          在這個例子中,我們創(chuàng)建了一個可觀察對象data,并將其name屬性綁定到一個輸入字段和一個顯示段落。當用戶在輸入字段中鍵入時,data.name的值會發(fā)生變化。處理程序會攔截此更改并通知所有觀察者。觀察者nameDisplayObserver隨后更新顯示段落的內(nèi)容,實現(xiàn)了雙向數(shù)據(jù)綁定。

          通過使用Proxy實現(xiàn)觀察者模式,我們可以有效地攔截和處理對象上的屬性操作,實現(xiàn)雙向數(shù)據(jù)綁定和響應(yīng)式更新。本文介紹了觀察者模式的基本概念,并詳細講解了如何在JavaScript中使用Proxy實現(xiàn)該模式。希望本文能幫助你更好地理解和應(yīng)用這種強大的設(shè)計模式在你的項目中。

          天給大家講解的是include標簽,在打代碼的時候總會出現(xiàn)一些重復(fù)的樣式,這個時候就可以用include標簽來減少打代碼的次數(shù)。


          文件名index.html,代碼:

          {% from 'macros/forms.html' import input %}<!DOCTYPE html><html lang="en"><head>
              <meta charset="UTF-8">
              <title>宏</title>
              <style>
                  *{            list-style: none;            text-decoration: none;        }
                  .header{            height: 60px;            background: #3a3a3a;            color: #fff;            margin-bottom: 20px;        }
                  .header .nav-group{            margin-left: 10px;        }
                  .header .nav-group li{            float: left;            line-height: 60px;            margin: 0px 20px;        }
                  .nav-group li a{            color: #fff;        }
                  .footer{            height: 60px;            background: #3a3a3a;        }
                  .footer p{            color: #fff;            margin-left: 30px;            padding-top: 20px;        }
              </style></head><body>
              <div class="header">
                  <ul class="nav-group">
                      <li><a href="#">新聞</a></li>
                      <li><a href="#">音樂</a></li>
                      <li><a href="#">貼吧</a></li>
                      <li><a href="#">視頻</a></li>
                  </ul>
              </div>
              <table>
                  <tbody>
                      <tr>
                          <td>賬號</td>
                          <td>{{ input(placeholder="請輸入賬號") }}</td>
                      </tr>
                      <tr>
                          <td>密碼</td>
                          <td>{{ input(type="password", placeholder="請輸入密碼") }}</td>
                      </tr>
                      <tr>
                          <td></td>
                          <td>{{ input(type="submit", value="提交") }}</td>
                      </tr>
                  </tbody>
              </table>
              <div class="footer">
                  <p>頁面底部</p>
              </div></body></html>
          

          現(xiàn)在考慮這樣一個問題,如果頁面頭部和底部是很多頁面要用的樣式,那么如果在每一個新的文件中都要復(fù)制相同的代碼肯定不是我們希望的,這時候就可以用到include標簽了:

          用法

          {% include '引用文件路徑' %}
          

          用include前提是把相同的代碼先提取出來,所以我們將對應(yīng)的代碼先提取成文件:

          文件結(jié)構(gòu):

          headers.html

          <style>
              *{        list-style: none;        text-decoration: none;    }
              .header{        height: 60px;        background: #3a3a3a;        color: #fff;        margin-bottom: 20px;    }
              .header .nav-group{        margin-left: 10px;    }
              .header .nav-group li{        float: left;                line-height: 60px;                margin: 0px 20px;        }
              .nav-group li a{        color: #fff;        }</style><div class="header">
              <ul class="nav-group">
                  <li><a href="#">新聞</a></li>
                  <li><a href="#">音樂</a></li>
                  <li><a href="#">貼吧</a></li>
                  <li><a href="#">視頻</a></li>
              </ul></div>
          

          footers.html

          <style>
              .footer{        height: 60px;        background: #3a3a3a;    }
              .footer p{        color: #fff;        margin-left: 30px;                padding-top: 20px;        }</style><div class="footer">
              <p>頁面底部</p></div>
          

          將公共部分提取出以后在調(diào)用的地方只需要用include標簽調(diào)用即可:

          index.html

          {% from 'macros/forms.html' import input %}<!DOCTYPE html><html lang="en"><head>
              <meta charset="UTF-8">
              <title>宏</title></head><body>
              {% include 'index/headers.html' %}    <table>
                  <tbody>
                      <tr>
                          <td>賬號</td>
                          <td>{{ input(placeholder="請輸入賬號") }}</td>
                      </tr>
                      <tr>
                          <td>密碼</td>
                          <td>{{ input(type="password", placeholder="請輸入密碼") }}</td>
                      </tr>
                      <tr>
                          <td></td>
                          <td>{{ input(type="submit", value="提交") }}</td>
                      </tr>
                  </tbody>
              </table>
              {% include 'index/footers.html' %}</body></html>
          

          如果還有一個詳情頁,那么只需要:

          detail.html

          <!DOCTYPE html><html lang="en"><head>
              <meta charset="UTF-8">
              <title>Detail</title></head><body>
              {% include 'index/headers.html' %}        <p>這是詳情頁</p>
              {% include 'index/footers.html' %}</body></html>
          

          顯示

          如果對接口、性能、自動化測試、面試經(jīng)驗交流等感興趣的,可以關(guān)注我的頭條號,我會不定期的發(fā)放免費的資料,這些資料都是從各個技術(shù)網(wǎng)站搜集、整理出來的,如果你有好的學習資料可以私聊發(fā)我,我會注明出處之后分享給大家。歡迎分享,歡迎評論,歡迎轉(zhuǎn)發(fā)。需要資料的同學可以關(guān)注小編+轉(zhuǎn)發(fā)文章+私信【測試資料】

          文為大家介紹如何使用 CSS 創(chuàng)建一個帶搜索的導(dǎo)航欄。

          以下實例均是響應(yīng)式的。

          可以先看下效果圖:

          創(chuàng)建一個搜索欄

          HTML 代碼

          <div class="topnav">

          <a class="active" href="#home">主頁</a>

          <a href="#about">關(guān)于</a>

          <a href="#contact">聯(lián)系我們</a>

          <input type="text" placeholder="搜索..">

          </div>

          CSS 代碼

          /* 在頂部導(dǎo)航欄中添加黑色背景顏色 */

          .topnav {

          overflow: hidden;

          background-color: #e9e9e9;

          }


          主站蜘蛛池模板: 日韩一区二区三区电影在线观看| 亚洲一区二区三区久久| 日韩精品一区二区亚洲AV观看 | 久久精品一区二区影院| 精品成人乱色一区二区| 国产午夜精品一区理论片飘花| 国产高清视频一区二区| 日本伊人精品一区二区三区 | 天堂va在线高清一区| 在线精品动漫一区二区无广告| 国产在线精品一区二区在线看 | 亚洲日韩AV一区二区三区四区 | 亚洲日韩国产欧美一区二区三区| 伊人激情AV一区二区三区| 久久精品国产第一区二区| 男人的天堂精品国产一区| 久久精品无码一区二区三区不卡| 亚洲av成人一区二区三区| 亚洲国产精品第一区二区| 国产高清视频一区三区| 国产成人精品无码一区二区| 中文字幕永久一区二区三区在线观看| 国产一区二区三区在线电影| 秋霞鲁丝片一区二区三区| 欧洲亚洲综合一区二区三区| 国产无吗一区二区三区在线欢| 日本福利一区二区| 国产精品成人一区无码| 国产一区二区在线观看麻豆| 精品一区二区三区视频在线观看| 欧美一区内射最近更新| 日本一区二区三区在线观看视频| 成人精品一区久久久久| 无遮挡免费一区二区三区| 日韩精品无码一区二区视频| 中文字幕亚洲一区| 亚欧成人中文字幕一区| 国产成人久久精品区一区二区 | 国产亚洲一区二区三区在线不卡| 久久亚洲中文字幕精品一区四| 国产在线一区二区三区|