鑰匙要點
- object.observe,也稱為o.o,是ecmascript 7的一部分,可以添加到javaScript中,以在瀏覽器中本地支持對象更改檢測。它直接在對像上工作,而無需創建周圍的任何包裝器,從而易於使用並有益於性能。 observe()方法是一種在對像上定義的異步靜態方法,可用於尋找對象的更改。它接受三個參數:要觀察的對象,檢測到更改時要調用的回調函數,以及一個可選的數組,其中包含要觀看的更改類型。
- 觀察數組類似於觀察對象,唯一的區別是觀察者函數必須使用Array.Observe而不是Object.Observe。 >可以分別使用object.unobserve()或array.unobserve()刪除對像或數組上的註冊觀察者。此方法接受兩個參數,即對像或數組,以及要刪除的回調。
- >
- 雙向數據綁定現在是客戶端應用程序的關鍵特徵之一。沒有數據綁定,開發人員就必須處理大量邏輯,以在模型發生變化時手動將數據綁定到視圖。 JavaScript庫,例如基因敲除,Angularjs和Ember都支持雙向綁定,但這些庫使用不同的技術來檢測變化。 淘汰賽和Ember使用可觀察的物品。可觀察物是包裹在模型對象屬性的功能。每當相應對像或屬性的值發生變化時,都會調用這些功能。儘管這種方法運行良好,並且檢測並通知所有更改,但它剝奪了使用普通JavaScript對象的自由,因為我們必須處理功能。
- 一個可選的數組,其中包含要觀看的更改類型
- >讓我們看看使用該方法的示例。考慮以下片段:
- 在此代碼中,我們創建了一個具有一些數據的對象。我們還定義了一個名為observecallback()的函數,該函數將用於記錄對象的更改。然後,我們開始使用O.O.開始觀察更改。最後,我們對對象進行了一些更改。
- 應用更改的對象 >
- >讓我們添加上面已定義的類型定義的新屬性。該屬性的值指定是否完成了TODO項目。當完成的價值設置為true時,我們需要將屬性的值設置為true。
- 以下片段定義了此屬性:
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()方法是一種在對像上定義的異步靜態方法。它可用於尋找對象的更改,並且接受三個參數:
一個要觀察的對象
>- 檢測到更改時要調用的回調函數
>如果您在控制台上看到輸出,則會發現所有三個更改均被檢測到並記錄。以下屏幕截圖顯示了摘要產生的結果:
<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()方法完成。此方法接受三個參數:>自定義類型的名稱
執行更改的回調函數- >回調函數。從此功能返回的值在“變更對象”中使用
>一旦執行了pertermchange回調的邏輯,將通過傳遞的自定義更改類型通知更改。 Observe默認情況下不會觀察到這種類型。我們需要明確要求O.O觀察自定義類型的更改。以下片段在托多對像上顯示了一個修改的o.o,以觀察自定義類型的更改以及添加和更新類型: >上面的摘要將“封鎖”值設置為true之前,然後將其設置為true。因此,它發送了帶有自定義更改類型的通知。以下屏幕截圖顯示了由自定義類型返回的更改對象的詳細信息:
觀察數組
請參閱codepen上的sitepoint(@sitepoint)的筆gggezq。
結論 為什麼對object.observe棄用了? 對象。它無法觀察到功能中所做的更改,也無法跟踪對象原型的更改。此外,發現它在性能方面效率低下,因為它需要大量資源來跟踪大對象的變化。貶值也受到ES6中新功能(例如代理和反思)的引入的影響,這些特徵提供了更有效的方法來觀察和反應對象的變化。 > es6 proxies如何作為object.observe的替代方案? > ES6代理提供了一種自定義對像上基本操作的行為的方法。使用兩個參數創建代理:目標對象和處理程序對象。處理程序對象為目標對象的各種操作定義了“陷阱”。執行這些操作後,觸發處理程序中的相應陷阱,從而可以執行自定義行為。這使得代理成為觀察對像變化和反應的強大工具。 我仍然可以在項目中使用object。仍然使用對象。在您的項目中,它是強烈灰心的。 Obser.Observe已被棄用並從JavaScript標準中刪除,這意味著它不再維護,並且可能不受所有瀏覽器的支持。使用折衷的功能可能會導致項目中的兼容性問題和其他問題。建議使用諸如ES6代理或庫之類的替代方案,例如mobx或vue.js. ES6代理通常比Object.Observe更有效,尤其是在處理大型對象時。但是,像任何功能一樣,應明智地使用它們。為應用程序中的每個對象創建代理都會導致性能問題。最好僅在必要時使用代理,並保持處理程序盡可能輕巧。 如何處理MOBX或VUE.JS之類的庫處理對象觀察? > JavaScript中對象觀察的未來是什麼? JavaScript可能會因語言的持續發展以及庫和框架的發展而塑造。 ES6代理和反思之類的功能為觀察和反應對象的變化提供了強大的工具,MOBX和VUE.JS之類的庫以這些工具為基礎,以提供高級API來進行對象觀察。隨著語言和生態系統的繼續發展,我們可以期望看到更有效,更靈活的方法來觀察對象的變化。<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>
>下面報告了此示例的實時演示(請記住要打開控制台以查看結果):
觀察數組類似於觀察對象。唯一的區別是觀察者函數必須使用array.observe而不是object.observe註冊。以下片段證明了這一點:
<span>Object.observe(person, observeCallback, ['add', 'update']);</span>
>
<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>
>
客戶端雙向綁定周圍的未來將通過瀏覽器的出色添加而更加明亮。讓我們期待其他瀏覽器儘早趕上!
經常詢問的問題(常見問題解答)。
> aboce.observe的替代方法是什麼?最受歡迎的選擇之一是使用ES6代理。代理允許您為對象的基本操作定義自定義行為,例如屬性查找,分配,枚舉,功能調用等。另一種選擇是使用庫(例如mobx或vue.js),它們提供了自己的機制來觀察對象的變化。
>使用ES6代理而不是對象。它們提供了一種更靈活,更有力的方法來觀察和對物體變化的反應。使用代理,您可以為廣泛的操作定義自定義行為,而不僅僅是對屬性的變化。代理也比Object.Observe更好,尤其是在處理大型對象時。此外,代理是ES6標準的一部分,這意味著它們得到了所有現代瀏覽器的支持。
>我如何從對象遷移。代理涉及替換對象。用代理對象訪問呼叫。您沒有觀察到對象屬性的更改,而是為要在代理的處理程序對像中觀察到的操作定義陷阱。這可能涉及您的代碼進行一些重構,但它提供了一種更加靈活,更有效的方法來觀察對象的變化。
使用ES6代理的性能影響是什麼?
使用ES6 Proxies是否存在任何限製或問題?他們確實有一些局限性。例如,它們不能用於觀察對數組長度屬性的更改。同樣,代理並不能提供觀察對象原型更改的方法。但是,通常可以使用ES6的其他功能來解決這些局限性,例如Reffle。
MOBX或VUE等庫.js提供了自己的機制來觀察對象的變化。例如,MOBX使用可觀察的屬性和計算值來跟踪變化,而VUE.JS使用反應性數據模型。這些庫提供了用於對象觀察的高級API,使其比原始的ES6代理更易於使用。
以上是對像簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版
視覺化網頁開發工具