目錄
鑰匙要點
註冊通知
觀察數組類似於觀察對象。唯一的區別是觀察者函數必須使用array.observe而不是object.observe註冊。以下片段證明了這一點:
> aboce.observe的替代方法是什麼?最受歡迎的選擇之一是使用ES6代理。代理允許您為對象的基本操作定義自定義行為,例如屬性查找,分配,枚舉,功能調用等。另一種選擇是使用庫(例如mobx或vue.js),它們提供了自己的機制來觀察對象的變化。
>使用ES6代理而不是對象。它們提供了一種更靈活,更有力的方法來觀察和對物體變化的反應。使用代理,您可以為廣泛的操作定義自定義行為,而不僅僅是對屬性的變化。代理也比Object.Observe更好,尤其是在處理大型對象時。此外,代理是ES6標準的一部分,這意味著它們得到了所有現代瀏覽器的支持。
>我如何從對象遷移。代理涉及替換對象。用代理對象訪問呼叫。您沒有觀察到對象屬性的更改,而是為要在代理的處理程序對像中觀察到的操作定義陷阱。這可能涉及您的代碼進行一些重構,但它提供了一種更加靈活,更有效的方法來觀察對象的變化。
使用ES6代理的性能影響是什麼?
使用ES6 Proxies是否存在任何限製或問題?他們確實有一些局限性。例如,它們不能用於觀察對數組長度屬性的更改。同樣,代理並不能提供觀察對象原型更改的方法。但是,通常可以使用ES6的其他功能來解決這些局限性,例如Reffle。
MOBX或VUE等庫.js提供了自己的機制來觀察對象的變化。例如,MOBX使用可觀察的屬性和計算值來跟踪變化,而VUE.JS使用反應性數據模型。這些庫提供了用於對象觀察的高級API,使其比原始的ES6代理更易於使用。
首頁 web前端 js教程 對像簡介

對像簡介

Feb 20, 2025 am 09:05 AM

對像簡介

鑰匙要點

  • object.observe,也稱為o.o,是ecmascript 7的一部分,可以添加到javaScript中,以在瀏覽器中本地支持對象更改檢測。它直接在對像上工作,而無需創建周圍的任何包裝器,從而易於使用並有益於性能。
  • observe()方法是一種在對像上定義的異步靜態方法,可用於尋找對象的更改。它接受三個參數:要觀察的對象,檢測到更改時要調用的回調函數,以及一個可選的數組,其中包含要觀看的更改類型。
  • 觀察數組類似於觀察對象,唯一的區別是觀察者函數必須使用Array.Observe而不是Object.Observe。
  • >可以分別使用object.unobserve()或array.unobserve()刪除對像或數組上的註冊觀察者。此方法接受兩個參數,即對像或數組,以及要刪除的回調。
  • >
  • 雙向數據綁定現在是客戶端應用程序的關鍵特徵之一。沒有數據綁定,開發人員就必須處理大量邏輯,以在模型發生變化時手動將數據綁定到視圖。 JavaScript庫,例如基因敲除,Angularjs和Ember都支持雙向綁定,但這些庫使用不同的技術來檢測變化。
  • 淘汰賽和Ember使用可觀察的物品。可觀察物是包裹在模型對象屬性的功能。每當相應對像或屬性的值發生變化時,都會調用這些功能。儘管這種方法運行良好,並且檢測並通知所有更改,但它剝奪了使用普通JavaScript對象的自由,因為我們必須處理功能。 什麼是object.observe?

    object.observe,又稱O.O,是ecmascript 7的一部分,是一個要添加到JavaScript中的功能,以在瀏覽器中本地支持對象更改檢測。儘管ES7尚未完成,但此功能已經在基於眨眼的瀏覽器(Chrome和Opera)中支持。

    >。

    因為object.observe將由瀏覽器本地支持,並且它直接在對像上起作用而無需創建周圍的任何包裝器,因此API既易於使用又易於使用。如果Object.Observe由瀏覽器支持,則可以實現雙向綁定而無需外部庫。這並不意味著一旦實現了O.O,所有現有的雙向綁定庫將無用。我們仍然需要它們在使用O.O.檢測更改後有效地更新UI。此外,如果並非全部針對的瀏覽器支持O.O.

    觀察對象的屬性

    >現在您已經了解了O.O有益的東西,讓我們在行動中看到它。 >

    observe()方法是一種在對像上定義的異步靜態方法。它可用於尋找對象的更改,並且接受三個參數:>

    一個要觀察的對象

    >
      檢測到更改時要調用的回調函數
    • 一個可選的數組,其中包含要觀看的更改類型
    • >讓我們看看使用該方法的示例。考慮以下片段:
    • 在此代碼中,我們創建了一個具有一些數據的對象。我們還定義了一個名為observecallback()的函數,該函數將用於記錄對象的更改。然後,我們開始使用O.O.開始觀察更改。最後,我們對對象進行了一些更改。
    >

    >如果您在控制台上看到輸出,則會發現所有三個更改均被檢測到並記錄。以下屏幕截圖顯示了摘要產生的結果:

    <span>var person = {
    </span>  <span>name: 'Ravi',
    </span>  <span>country: 'India',
    </span>  <span>gender: 'Male'
    </span><span>};
    </span>
    <span>function observeCallback(changes){
    </span>  <span>console.log(changes);
    </span><span>};
    </span>
    <span>Object.observe(person, observeCallback);
    </span>
    person<span>.name = 'Rama';  // Updating value
    </span>person<span>.occupation = 'writer';  // Adding a new property
    </span><span>delete person.gender;  // Deleting a property</span>
    登入後複製
    登入後複製
    登入後複製

    o.o不同步運行,它將所有更改都發生了,並在調用時將它們傳遞給回調。因此,在這裡,我們收到了對對像上應用的三個更改的三個條目。如您所見,每個條目都由屬性的名稱更改,舊值,更改的類型以及具有新值的對象本身。

    >下面報告了上一個代碼的實時演示(請記住要打開控制台以查看結果):

    請參閱codepen上的sitepoint(@sitepoint)的筆emkveb。 在我們的代碼中,我們沒有指定要查找的更改的類型,因此它觀察到添加,更新和刪除。可以使用觀察方法的第三個參數來控制這:對像簡介>
    <span>var person = {
    </span>  <span>name: 'Ravi',
    </span>  <span>country: 'India',
    </span>  <span>gender: 'Male'
    </span><span>};
    </span>
    <span>function observeCallback(changes){
    </span>  <span>console.log(changes);
    </span><span>};
    </span>
    <span>Object.observe(person, observeCallback);
    </span>
    person<span>.name = 'Rama';  // Updating value
    </span>person<span>.occupation = 'writer';  // Adding a new property
    </span><span>delete person.gender;  // Deleting a property</span>
    登入後複製
    登入後複製
    登入後複製

    註冊通知

    observe()方法能夠檢測對添加到對象的直接屬性上所做的更改。它無法檢測使用Geters和setter創建的屬性的更改。由於這些屬性的行為由作者控制,因此變更檢測也必須由作者擁有。要解決此問題,我們需要使用通知器(通過object.getNotifier()獲得)來通知屬性上所做的更改。

    >

    考慮以下片段:

    <span>Object.observe(person, observeCallback, ['add', 'update']);</span>
    登入後複製
    登入後複製

    toodype是具有兩個屬性的構造函數。除此之外,還使用object.defineproperty添加了阻塞。在我們的示例中,為此屬性定義的設置器很簡單。在典型的業務應用程序中,它可能執行一些驗證,並且如果驗證失敗,則可能無法設置值。但是,我想讓事情變得簡單。
    最後注意,您可以看到在我們的示例中,只有在有更新時發送通知。

    >

    對屬性進行的更改會在Chrome開發人員工具中產生以下結果:>

    對像簡介>下面報告了此示例的實時演示(請記住要打開控制台以查看結果):

    請參閱codepen上的sitepoint(@sitepoint)的筆npzgoo。

    觀察多個變化

    有時,在以某種方式修改兩個或多個屬性後,我們可能有一個計算要運行。儘管我們可以使用通知器單獨通知這兩個更改,但是最好發送帶有自定義類型名稱的單個通知,以表明兩個值都已修改。這可以使用notifier.performchange()方法完成。此方法接受三個參數:

    >自定義類型的名稱

    執行更改的回調函數
      >回調函數。從此功能返回的值在“變更對象”中使用
    • 應用更改的對象
    • >
    • >讓我們添加上面已定義的類型定義的新屬性。該屬性的值指定是否完成了TODO項目。當完成的價值設置為true時,我們需要將屬性的值設置為true。
    • 以下片段定義了此屬性:

    >一旦執行了pertermchange回調的邏輯,將通過傳遞的自定義更改類型通知更改。 Observe默認情況下不會觀察到這種類型。我們需要明確要求O.O觀察自定義類型的更改。以下片段在托多對像上顯示了一個修改的o.o,以觀察自定義類型的更改以及添加和更新類型:>

    <span>var person = {
    </span>  <span>name: 'Ravi',
    </span>  <span>country: 'India',
    </span>  <span>gender: 'Male'
    </span><span>};
    </span>
    <span>function observeCallback(changes){
    </span>  <span>console.log(changes);
    </span><span>};
    </span>
    <span>Object.observe(person, observeCallback);
    </span>
    person<span>.name = 'Rama';  // Updating value
    </span>person<span>.occupation = 'writer';  // Adding a new property
    </span><span>delete person.gender;  // Deleting a property</span>
    登入後複製
    登入後複製
    登入後複製

    >上面的摘要將“封鎖”值設置為true之前,然後將其設置為true。因此,它發送了帶有自定義更改類型的通知。以下屏幕截圖顯示了由自定義類型返回的更改對象的詳細信息:>

    對像簡介>下面報告了此示例的實時演示(請記住要打開控制台以查看結果):

    >請參閱codepen上的sitepoint(@sitepoint)的筆yyexgd。

    觀察數組

    觀察數組類似於觀察對象。唯一的區別是觀察者函數必須使用array.observe而不是object.observe註冊。以下片段證明了這一點:

    >下面報告了此示例的實時演示(請記住要打開控制台以查看結果):
    <span>Object.observe(person, observeCallback, ['add', 'update']);</span>
    登入後複製
    登入後複製

    請參閱codepen上的sitepoint(@sitepoint)的筆gggezq。

    刪除註冊的觀察者

    >可以分別使用object.unobserve()或array.unobserve()刪除對像或數組上的註冊觀察者。此方法接受兩個參數,即對像或數組以及要刪除的回調。因此,要使用此方法,我們需要具有回調的引用。

    >

    結論

    一旦所有瀏覽器都完全支持O.O,更改檢測將在所有客戶端庫中進行標準化。 Aurelia已經開始使用它,Angular 2,watchtower.js的變更檢測庫,內部使用o.o,Ember也將在以後使用它來進行更改檢測。當O.O本地可用時,Angular 2和Aurelia的Pollyfills實施了後備。
    <span>function <span>TodoType</span>() {
    </span>  <span>this.item = '';
    </span>  <span>this.maxTime = '';
    </span>  
      <span>var blocked = false;
    </span>  
      <span>Object.defineProperty(this, 'blocked', {
    </span>    <span>get:function(){
    </span>      <span>return blocked;
    </span>    <span>},
    </span>    <span>set: function(value){
    </span>      <span>Object.getNotifier(this).notify({
    </span>        <span>type: 'update',
    </span>        <span>name: 'blocked',
    </span>        <span>oldValue: blocked
    </span>      <span>});
    </span>      blocked <span>= value;
    </span>    <span>}
    </span>  <span>});
    </span><span>}
    </span>
    <span>var todo = new TodoType();
    </span>
    todo<span>.item = 'Get milk';
    </span>todo<span>.maxTime = '1PM';
    </span>
    <span>console.log(todo.blocked);
    </span>
    <span>Object.observe(todo, function(changes){
    </span>  <span>console.log(changes);
    </span><span>}, ['add', 'update']);
    </span>
    todo<span>.item = 'Go to office';
    </span>todo<span>.blocked = true;</span>
    登入後複製
    >

    客戶端雙向綁定周圍的未來將通過瀏覽器的出色添加而更加明亮。讓我們期待其他瀏覽器儘早趕上!

    經常詢問的問題(常見問題解答)。

    為什麼對object.observe棄用了?

    對象。它無法觀察到功能中所做的更改,也無法跟踪對象原型的更改。此外,發現它在性能方面效率低下,因為它需要大量資源來跟踪大對象的變化。貶值也受到ES6中新功能(例如代理和反思)的引入的影響,這些特徵提供了更有效的方法來觀察和反應對象的變化。

    > aboce.observe的替代方法是什麼?最受歡迎的選擇之一是使用ES6代理。代理允許您為對象的基本操作定義自定義行為,例如屬性查找,分配,枚舉,功能調用等。另一種選擇是使用庫(例如mobx或vue.js),它們提供了自己的機制來觀察對象的變化。

    > es6 proxies如何作為object.observe的替代方案? > ES6代理提供了一種自定義對像上基本操作的行為的方法。使用兩個參數創建代理:目標對象和處理程序對象。處理程序對象為目標對象的各種操作定義了“陷阱”。執行這些操作後,觸發處理程序中的相應陷阱,從而可以執行自定義行為。這使得代理成為觀察對像變化和反應的強大工具。

    >使用ES6代理而不是對象。它們提供了一種更靈活,更有力的方法來觀察和對物體變化的反應。使用代理,您可以為廣泛的操作定義自定義行為,而不僅僅是對屬性的變化。代理也比Object.Observe更好,尤其是在處理大型對象時。此外,代理是ES6標準的一部分,這意味著它們得到了所有現代瀏覽器的支持。

    我仍然可以在項目中使用object。仍然使用對象。在您的項目中,它是強烈灰心的。 Obser.Observe已被棄用並從JavaScript標準中刪除,這意味著它不再維護,並且可能不受所有瀏覽器的支持。使用折衷的功能可能會導致項目中的兼容性問題和其他問題。建議使用諸如ES6代理或庫之類的替代方案,例如mobx或vue.js.

    >我如何從對象遷移。代理涉及替換對象。用代理對象訪問呼叫。您沒有觀察到對象屬性的更改,而是為要在代理的處理程序對像中觀察到的操作定義陷阱。這可能涉及您的代碼進行一些重構,但它提供了一種更加靈活,更有效的方法來觀察對象的變化。

    使用ES6代理的性能影響是什麼?

    ES6代理通常比Object.Observe更有效,尤其是在處理大型對象時。但是,像任何功能一樣,應明智地使用它們。為應用程序中的每個對象創建代理都會導致性能問題。最好僅在必要時使用代理,並保持處理程序盡可能輕巧。

    使用ES6 Proxies是否存在任何限製或問題?他們確實有一些局限性。例如,它們不能用於觀察對數組長度屬性的更改。同樣,代理並不能提供觀察對象原型更改的方法。但是,通常可以使用ES6的其他功能來解決這些局限性,例如Reffle。

    如何處理MOBX或VUE.JS之類的庫處理對象觀察?

    MOBX或VUE等庫.js提供了自己的機制來觀察對象的變化。例如,MOBX使用可觀察的屬性和計算值來跟踪變化,而VUE.JS使用反應性數據模型。這些庫提供了用於對象觀察的高級API,使其比原始的ES6代理更易於使用。

    > JavaScript中對象觀察的未來是什麼? JavaScript可能會因語言的持續發展以及庫和框架的發展而塑造。 ES6代理和反思之類的功能為觀察和反應對象的變化提供了強大的工具,MOBX和VUE.JS之類的庫以這些工具為基礎,以提供高級API來進行對象觀察。隨著語言和生態系統的繼續發展,我們可以期望看到更有效,更靈活的方法來觀察對象的變化。

以上是對像簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1419
52
Laravel 教程
1312
25
PHP教程
1262
29
C# 教程
1235
24
神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

See all articles