Object.Observeによるデヌタバむンディング革呜

はじめに



革呜が来おいたす。 JavaScriptに新たに远加されたものは、デヌタバむンディングに぀いおこれたでに知っおいたすべおを倉曎したす。 さらに、モデルの線集ず曎新を監芖するMVCラむブラリのアプロヌチも倉わりたす。 準備はいいですか



いいね 匕っ匵りたせん。 Chrome 36のベヌタ版に登堎したObject.observeを玹介できおうれしいです。[CROWD HAPPY]



Object.observeは、次のECMAScript暙準の䞀郚です。 サヌドパヌティのラむブラリを䜿甚せずに、JavaScriptオブゞェクトぞの倉曎を非同期で远跡できたす。オブザヌバヌは、オブゞェクトの状態の倉化を経時的に远跡できたす。





//  ,        var model = {}; //      Object.observe(model, function(changes){ //     , changes.forEach(function(change) { //   ,   console.log(change.type, change.name, change.oldValue); }); });
      
      





オブゞェクトを倉曎するたびに、アラヌトを受け取りたす





Object.observeOoたたはOoooooooず呌びたいを䜿甚するず、フレヌムワヌクを䜿甚せずに双方向のデヌタバむンディングを実装できたす。



これは、䜿甚すべきではないずいう意味ではありたせん。 耇雑なビゞネスロゞックを持぀倧芏暡なプロゞェクトの堎合、フレヌムワヌクが必芁であり、それらの䜿甚を思いずどたらせる぀もりはありたせん。 新しい開発者の䜜業を簡玠化し、サポヌトするために必芁なコヌドが少なくお枈み、特定のテンプレヌトを導入しお䞀般的なタスクを凊理するこずを目指しおいたす。 このような機胜が必芁ない堎合は、ポリマヌなどのより軜量な゜リュヌションを䜿甚できたすちなみに、既にOoを䜿甚しおいたす。



フレヌムワヌクたたはMV *ラむブラリを最倧限に䜿甚しおいる堎合でも、Ooを䜿甚するず、パフォヌマンスが向䞊したす。これは、迅速で簡玠化された実装によっお達成され、同時に同じAPIを䜿甚し続けたす。 たずえば、昚幎、Angular開発チヌムが比范分析を実斜した結果、ダヌティチェックには玄40ミリ秒かかりたしたが、O.oには玄1〜2ミリ秒かかりたした20〜40倍高速であるこずがわかりたした。

倧量の耇雑なコヌドを䜿甚する必芁のないデヌタバむンディング しかし、これはたた、倉曎に぀いおモデルに質問する必芁がなくなったこずを意味したす



O.oが䜕をしおいるのかを既に理解しおいる堎合、新しい機胜の説明にすぐに戻るか、このアプロヌチが解決する問題を読むこずができたす。



䜕を芋たすか



デヌタの監芖に぀いお話すずき、通垞、いく぀かのタむプの倉曎を远跡するこずを意味したす。



デヌタバむンディングの重芁性に぀いお



モデルずビュヌの盞互䜜甚に圱響を䞎え始めるず、デヌタバむンディングはアプリケヌションの重芁な郚分になり始めたす。 HTMLは優れた宣蚀メカニズムですが、完党に静的です。 理想的には、デヌタをDOMに関連付けお最新の状態に保ちたいだけです。 Ooを䜿甚した゜リュヌションでは、DOMに新しいデヌタを単玔に送信する繰り返しコヌドの倧きなチャンクを䜜成する必芁がないため、倚くの時間を節玄できたす。



デヌタバむンディングは、モデルのさたざたなプロパティずそれらを反映するUI芁玠の間に倚数の接続を確立する必芁がある包括的なナヌザヌむンタヌフェむスを䜜成する堎合に非垞に䟿利です。 これは、SPAシングルペヌゞアプリケヌションアプリケヌションを䜜成する際の最も䞀般的なタスクの1぀です。



圓初、デヌタを監芖するメカニズムはありたせんでしたが、今日たで䞖界䞭で䜿甚されおいるさたざたな䜎速ハックに䟝存しお、さたざたなJavaScriptフレヌムワヌクに責任を移したしたたたは小さなラむブラリを䜜成したした。



今日の䞖界は䜕ですか



ダヌティチェック


これたでデヌタバむンディングを芋たこずがありたすか さお、最新のMV *ラむブラリを䜿甚しおWebアプリケヌションAngular、Knockoutを䜜成する堎合、DOMぞのモデルデヌタバむンディングを既に䜿甚しおいる可胜性がありたす。 これをメモリ内で曎新するために、電話垳アプリケヌションの䟋を次に瀺したす。ここでは、番号の配列から各電話番号をリストアむテムにバむンドし、それらの間で䞀定の同期を維持したす。



 <html ng-app> <head> ... <script src="angular.js"></script> <script src="controller.js"></script> </head> <body ng-controller="PhoneListCtrl"> <ul> <li ng-repeat="phone in phones"> {{phone.name}} <p>{{phone.snippet}}</p> </li> </ul> </body> </html>
      
      





およびコントロヌラヌ甚のJavaScript



 var phonecatApp = angular.module('phonecatApp', []); phonecatApp.controller('PhoneListCtrl', function($scope) { $scope.phones = [ {'name': 'Nexus S', 'snippet': 'Fast just got faster with Nexus S.'}, {'name': 'Motorola XOOM with Wi-Fi', 'snippet': 'The Next, Next Generation tablet.'}, {'name': 'MOTOROLA XOOM', 'snippet': 'The Next, Next Generation tablet.'} ]; });
      
      





デモ



モデルデヌタが倉曎されるたびに、DOMのリストが曎新されたす。 Angularはどのようにこれを達成したすか たあ、圌は舞台裏で私たちがダヌティチェックず呌んでいるこずをしたす。







ダヌティチェックの基本的な考え方は、デヌタはい぀でも倉曎でき、ラむブラリはそれがどのように倉曎されたかをチェックする必芁があるずいうこずです。 角床の堎合、これは、远跡する必芁があるすべおのモデルデヌタの状態を登録するこずによっお発生したす。 圌はモデルの以前の倀を知っおおり、倀が倉化するず、察応するむベントが発生したす。 開発者にずっおの䞻な利益は、保守および結合が容易なネむティブJSオブゞェクトを䜿甚するこずです。 䞀方、アルゎリズムが非垞に貪欲である限り、これは非垞に高䟡な゜リュヌションになる可胜性がありたす。







このような操䜜のコストは、芳察されるオブゞェクトの総数に比䟋したす。 私はそのようなチェックをたくさんする必芁があるかもしれたせん。 「倚分」モデルが倉曎されたずきにダヌティチェックむベントをトリガヌする方法が必芁になる可胜性もありたす。 このような゜リュヌションを実装するために、フレヌムワヌクが頌りにしおきたいく぀かのトリックがありたす。 この決定が思い浮かぶかどうかはただ䞍明です。



Web゚コシステムには、その宣蚀的メカニズムを改善および開発するためのより倚くの機䌚が必芁です。たずえば、



コンテナオブゞェクトは、フレヌムワヌクが自身にデヌタを栌玍するオブゞェクトを䜜成するデヌタストレヌゞメカニズムであり、アクセサヌゲッタヌ/セッタヌを䜿甚しおアクセスが提䟛され、その倉曎をサブスクラむブする機胜も実装したす。 これは非垞にうたく機胜したす。アルゎリズムは非垞に高速な凊理を提䟛したす。 Emberでこのようなオブゞェクトを䜿甚する䟋を以䞋に瀺したす。



 // - MyApp.president = Ember.Object.create({ name: "Barak Obama" }); MyApp.country = Ember.Object.create({ //  "Binding"     Ember  , //        presidentNameBinding: "MyApp.president.name" }); // ,    Ember   MyApp.country.get("presidentName"); // " " //      , // ..     .
      
      





この堎合の倉化を怜出するコストは、倉化するプロパティの数に比䟋したす。 別の問題は、異なるタむプのオブゞェクトを䜿甚するこずです。 簡単に蚀えば、サヌバヌから受信したデヌタを倉換しお、監芖可胜なオブゞェクトにむンストヌルしたす。



これは、既存のJSコヌドずは特に互換性がありたせん。 ほずんどのコヌドは、通垞のデヌタコンテナオブゞェクトなどにラップされおいないずやり取りできるず想定しおいたすが、これらの特殊なオブゞェクトずはやり取りできたせん。



Object.observeの抂芁



これら2぀のナニバヌスを最倧限に掻甚できれば、本圓にクヌルです。通垞のオブゞェクトネむティブJavaScriptオブゞェクトをサポヌトしおデヌタの倉化を芳察し、ダヌティチェックを削陀し、代わりに適切なアルゎリズムを远加しおください。特性。 これらすべおの前向きな資質を組み合わせ、プラットフォヌムに組み蟌たれる人。 だから、満たす-Object.observe、䜿甚する準備ができたした



オブゞェクトを監芖し、プロパティを倉曎し、倉曎レポヌトを介しお倉曎を監芖できたす。 しかし、十分な理論、コヌドを芋おみたしょう





Object.observeおよびObject.unobserve



モデルを衚すネむティブJSオブゞェクトがあるず想像しおみたしょう。



 //       var todoModel = { label: 'Default', completed: false };
      
      





オブゞェクトに倉曎が加えられるずすぐに呌び出されるreturn関数を宣蚀するこずもできたす



 function observer(changes){ changes.forEach(function(change, i){ console.log('what property changed? ' + change.name); console.log('how did it change? ' + change.type); console.log('whats the current value? ' + change.object[change.name]); console.log(change); // all changes }); }
      
      





泚オブザヌバヌでreturn関数が呌び出されるず、監芖察象オブゞェクトは数回倉曎される可胜性があるため、倉曎ごずに新しい倀ず珟圚の倀は必ずしも同じではありたせん。



Ooを䜿甚しおこのような倉化を芳察し、芳察されたオブゞェクトを最初の匕数ずしお、返された関数を2番目ずしお枡したす。



 Object.observe(todoModel, observer);
      
      





モデルで䜕かを詊しおみたしょう



 todoModel.label = 'Buy some more milk';
      
      





コン゜ヌルを芋お、倚くの有甚な情報を埗たした どのプロパティが倉曎されたか、どのように倉曎されたか、どの新しい倀が割り圓おられたかがわかりたす。



わあ さようなら、ダヌティチェック トゥヌムストヌンの碑文は、Comic Sansによっお圫られたす。 別のプロパティを倉曎したしょう。 今回は完了したした



 todoModel.completeBy = '01/01/2014';
      
      





ご芧のように、倉曎に関するレポヌトを再び受け取りたした。



さお、オブゞェクトから「completed」プロパティを削陀するこずにした堎合はどうなるでしょう。



 delete todoModel.completed;
      
      







ご芧のずおり、倉曎レポヌトには削陀情報が含たれおいたす。 予想どおり、新しいプロパティ倀は未定矩です。 したがっお、新しいプロパティが远加たたは削陀されたこずを远跡できるこずがわかりたした。 簡単に蚀えば、オブゞェクトの倚くのプロパティ「新芏」、「削陀」、「再構成」ずそのプロトタむプチェヌンです。



他の監芖システムず同様に、オブゞェクトぞの倉曎の監芖を停止する方法が必芁です。 私たちの堎合、これはObject.unobserveであり、Ooず同じ眲名を持っおいたすが、次のように呌び出すこずができたす。



 Object.unobserve(todoModel, observer);
      
      





以䞋に瀺すように、最埌のメ゜ッドを呌び出した埌に加えられた倉曎は、コン゜ヌルぞの倉曎のレポヌトを衚瀺しなくなりたす。





プロパティに焊点を圓おる



それで、基本に慣れたら、芳察察象の倉曎のリストに戻りたしょう。



 Object.observe(obj, callback, opt_acceptList)
      
      





䟋に移り、これがどのように䜿甚されるかを芋おみたしょう。



 //     ,       var todoModel = { label: 'Default', completed: false }; //        // ,    function observer(changes){ changes.forEach(function(change, i){ console.log(change); }) }; //         , //    ,    Object.observe(todoModel, observer, ['delete']); //        //      todoModel.label = 'Buy some milk'; //  ,    !
      
      





ここで、「label」プロパティを削陀するず、倉曎に関する通知が発生したす。



 delete todoModel.label;
      
      





Ooに適甚可胜なタむプのリストを指定しない堎合、デフォルトでは、倉曎を远加する「内郚」オブゞェクトが枡されたす。このオブゞェクトは、「add」、「update」、「delete」、「reconfigure」、芳察可胜。



通知



Ooには、通知アラヌトの抂念もありたす。 圌らはあなたの携垯電話に珟れる迷惑なものずは䜕の関係もありたせん、圌らははるかに䟿利です。 通知はMutation Observers およびzag2artのハブ に関するすばらしい蚘事に䌌おいたす。 それらは、マむクロタスクの完了時に発生したす。 ブラりザヌコンテキストでは、ほずんどの堎合、珟圚のむベントハンドラヌの最埌に発生したす。



このような時間は、䞻芁な䜜業がすでに完了しおいるずいう事実により非垞に䟿利であり、オブザヌバヌは䞻芁なロゞックに干枉するこずなく䜜業を開始できたす。 これは、優れたステップバむステップのむベント凊理モデルです。



アラヌトを䜿甚しお構築されたワヌクフロヌは次のようになりたす。



画像



次に、通知を䜿甚しおオブゞェクトの状態の倉化を通知する方法の䟋を芋おみたしょう。 コメントに泚意しおください



 //    var model = { a: {} }; //   ,      //     var _b = 2; //    "b"    "a" //       Object.defineProperty(model.a, 'b', { get: function () { return _b; }, set: function (b) { //   "b"   , //       // ,   .    //     Object.getNotifier(this).notify({ type: 'update', name: 'b', oldValue: _b }); //        //  -   console.log('set', b); _b = b; } }); //    function observer(changes) { changes.forEach(function (change, i) { console.log(change); }) } //     model.a Object.observe(model.a, observer);
      
      









ここでは、デヌタが倉曎「曎新」されたずきにアラヌトを衚瀺したす。実際、notifier.notifyChangeメ゜ッドの呌び出しで瀺されおいる堎合は䜕でも衚瀺されたす。



りェブ開発の長幎の経隓から、同期操䜜が私たちが最初に孊ぶこずであるこずがわかりたした。 そのような操䜜だけを管理するのが最も簡単です。 問題は、これにより朜圚的に危険な凊理モデルデヌタ凊理モデルなど が䜜成されるこずです。 コヌドを曞いお、たずえば「オブゞェクトのプロパティを曎新する」ず曞いた堎合、これが望んでいるこずを䜕でもできる関数の途䞭で任意のコヌドをトリガヌするこずはほずんど望みたせん。



オブザヌバヌ偎からでも、サヌドパヌティの関数が珟圚の関数の途䞭から呌び出されるこずは望たしくありたせん。 関数呌び出しの堎所の䞀貫性ず断片化は迷惑ですよね そしお、これにさらに゚ラヌチェック、およびこのアプロヌチで生掻を耇雑にする他の状況を远加したす。 その結果、このようなモデルで䜜業するこずは本圓に難しいこずがわかりたす。 非同期アプロヌチは理解するのがより困難ですが、それでも、今日、それより優れたものはありたせん。



この問題の解決策は、総合的なレコヌドの倉曎です。



レコヌドの総合的な倉曎



簡単に蚀うず、アクセサたたは蚈算されたプロパティにアクセスする必芁がある堎合 ここでプロパティに぀いお読むこずができたす 、このプロパティが倉曎されたずきにアラヌトを䜜成する責任がありたす。 これは少し䜜業を远加したすが、䞍䟿ずいうよりは機胜です。 通知は、他のプロパティの倉曎の通知ずずもに配信され、次の圢匏になりたす。







アクセサの監芖ず蚈算されたプロパティの倉曎は、notifier.notifyを䜿甚しお実行できたすこれはObject.observe仕様にも含たれおいたす。 倚くの倉曎監芖システムは、倉曎された倀に関する情報を提䟛する必芁があり、率盎に蚀っお、これを行う方法はかなりありたす。 Object.observeは、「正しい」パスを私たちに課したせん。



Web開発者は、蚈算されたプロパティの倉曎の通知を支揎するために、ラむブラリから既補の゜リュヌションを期埅できるず思いたす。



次に、Circleクラスの䜜成を瀺す次の䟋に進みたしょう。 䞀番䞋の行は、円ずその「半埄」プロパティがあるこずです。 この䟋では、半埄はアクセサヌになり、倀が倉曎されるず、これを通知するむベントが発生したす。 オブゞェクトの倉曎に関する他のすべおの通知ずずもに配信されたす。



DevToolsでコヌドがどのように機胜するかを芋おみたしょう。



 function Circle(r) { var radius = r; var notifier = Object.getNotifier(this); function notifyAreaAndRadius(radius) { notifier.notify({ type: 'update', name: 'radius', oldValue: radius }) notifier.notify({ type: 'update', name: 'area', oldValue: Math.pow(radius * Math.PI, 2) }); } Object.defineProperty(this, 'radius', { get: function() { return radius; }, set: function(r) { if (radius === r) return; notifyAreaAndRadius(radius); radius = r; } }); Object.defineProperty(this, 'area', { get: function() { return Math.pow(radius, 2) * Math.PI; }, set: function(a) { r = Math.sqrt(a)/Math.PI; notifyAreaAndRadius(radius); radius = r; } }); } function observer(changes){ changes.forEach(function(change, i){ console.log(change); }) }
      
      







アクセサプロパティ



アクセサのプロパティに関する小さなメモ。 前に、プロパティ倀の倉化を芳察するこずに぀いおのみ説明したしたが、アクセサたたは蚈算されたプロパティのこのような動䜜に぀いおはたったく蚀及したせんでした。 その理由は、実際にはJavaScriptがアクセサの倀の倉化を远跡する機胜を持っおいないずいう事実です。実際、それらは関数のコレクションにすぎないからです。



アクセサヌを既に䜿甚しおいる堎合、それらがどのように機胜するか想像できたす。これらは、プロパティぞのアクセスを提䟛する関数のセットを提䟛するだけで、それ以䞊のものはありたせん。



単䞀のリタヌン関数で耇数のオブゞェクトを監芖する



Ooを䜿甚する堎合のもう1぀の可胜なパタヌンは、単䞀の戻り関数でオブゞェクト芳枬を䜿甚する衚蚘法です。 これにより、この関数を任意の数の異なるオブゞェクトのオブザヌバヌ関数ずしお䜿甚できたす。 返される関数は、远跡するすべおのオブゞェクトの倉曎の完党なセットを毎回提䟛したすこれは、すべおのマむクロタスクの終了時に発生したす。突然倉異オブザヌバヌを参照しおください。





倧芏暡な倉曎



おそらく、あなたは本圓にいプロゞェクトに取り組んでおり、定期的に倧芏暡な倉曎に察凊する必芁がありたす。

Ooは、すでに説明したnotifier.performChangeずnotifier.notifyの2぀の特定の関数でこれを支揎したす。







数孊的関数multiply、increment、incrementAndMultiplyを䜿甚しおThingyオブゞェクトを䜿甚しお倧芏暡な倉曎を蚘述する方法の䟋を芋おみたしょう。 関数を䜿甚するたびに、䜜業のコレクションに特定の皮類の倉曎が含たれおいるこずをシステムに通知したす。



䟋notifier.performChange 'foo'、performFooChangeFn;

 function Thingy(a, b, c) { this.a = a; this.b = b; } Thingy.MULTIPLY = 'multiply'; Thingy.INCREMENT = 'increment'; Thingy.INCREMENT_AND_MULTIPLY = 'incrementAndMultiply'; Thingy.prototype = { increment: function(amount) { var notifier = Object.getNotifier(this); //  ,       //   : // notifier.performChange('foo', performFooChangeFn); // notifier.notify('foo', 'fooChangeRecord'); notifier.performChange(Thingy.INCREMENT, function() { this.a += amount; this.b += amount; }, this); notifier.notify({ object: this, type: Thingy.INCREMENT, incremented: amount }); }, multiply: function(amount) { var notifier = Object.getNotifier(this); notifier.performChange(Thingy.MULTIPLY, function() { this.a *= amount; this.b *= amount; }, this); notifier.notify({ object: this, type: Thingy.MULTIPLY, multiplied: amount }); }, incrementAndMultiply: function(incAmount, multAmount) { var notifier = Object.getNotifier(this); notifier.performChange(Thingy.INCREMENT_AND_MULTIPLY, function() { this.increment(incAmount); this.multiply(multAmount); }, this); notifier.notify({ object: this, type: Thingy.INCREMENT_AND_MULTIPLY, incremented: incAmount, multiplied: multAmount }); } }
      
      







斜蚭に察しお2぀のオブザヌバヌを宣蚀したす。1぀はすべおの倉曎を監芖し、もう1぀は䞊蚘の特定の倉曎を報告するためのものですThingy.INCREMENT、Thingy.MULTIPLY、Thingy.INCREMENT_AND_MULTIPLY。



 var observer, observer2 = { records: undefined, callbackCount: 0, reset: function() { this.records = undefined; this.callbackCount = 0; }, }; observer.callback = function(r) { console.log(r); observer.records = r; observer.callbackCount++; }; observer2.callback = function(r){ console.log('Observer 2', r); } Thingy.observe = function(thingy, callback) { // Object.observe(obj, callback, optAcceptList) Object.observe(thingy, callback, [Thingy.INCREMENT, Thingy.MULTIPLY, Thingy.INCREMENT_AND_MULTIPLY, 'update']); } Thingy.unobserve = function(thingy, callback) { Object.unobserve(thingy); }
      
      







さお、これでコヌドを少し詊すこずができたす。新しいThingyを発衚したしょう



 var thingy = new Thingy(2, 4);
      
      







それを芳察し、いく぀かの倉曎を加えたす。かっこいい

 //   thingy (,     "  ") Object.observe(thingy, observer.callback); Thingy.observe(thingy, observer2.callback); //  ,    thingy thingy.increment(3); // { a: 5, b: 7 } thingy.b++; // { a: 5, b: 8 } thingy.multiply(2); // { a: 10, b: 16 } thingy.a++; // { a: 11, b: 16 } thingy.incrementAndMultiply(2, 2); // { a: 26, b: 36 }
      
      











「実行された機胜」内にあるすべおのものは、「倚数の倉曎」を䌎う䜜業ず芋なされたす。「倧きな倉化」を受け入れたオブザヌバヌはそれらを受け取るだけです。残りのオブザヌバヌは残りの倉曎を受け取りたす。



アレむ監芖



オブゞェクトの倉化を芳察するこずに぀いお話したしたが、配列に぀いおはどうですかいい質問ですずころで、圌らが私に「玠晎らしい質問」ず蚀うたびに、私は答えを決しお聞きたせん。このような良い質問に自分自身を祝犏するこずにあたりにも集䞭しおいたしたが、気が散りたした:)配列を扱うための新しい方法がありたす



Array.observe()



オブゞェクト自䜓に察する倚数の倉曎スプラむス、シフト解陀、スプラむスなどの長さを倉曎する䜕かを凊理するメ゜ッドです。

これを行うために、圌はnotifier.performChange("splice",...)







「配列」モデルを芳察しおいる䟋ず、同様に、デヌタを倉曎するアクションがモデルで実行されたずきに倉曎のリストを取埗する䟋を䜿甚したす。



 var model = ['Buy some milk', 'Learn to code', 'Wear some plaid']; var count = 0; Array.observe(model, function(changeRecords) { count++; console.log('Array observe', changeRecords, count); }); model[0] = 'Teach Paul Lewis to code'; model[1] = 'Channel your inner Paul Irish';
      
      









性胜



Ooの蚈算速床は、キャッシュ読み取り速床ず考えるこずができたす。䞀般的に、キャッシュは次の堎合に重芁な遞択肢です重芁床の高い順に。



Ooは、最初のようなナヌスケヌス向けに蚭蚈されおいたす。



ダヌティチェックでは、監芖しおいるすべおのデヌタのコピヌを保持する必芁がありたす。これは、Ooでは決しお埗られないメモリドレむンが埗られるこずを意味したす。ダヌティチェックは䞀皮のギャグであり、これは䞀皮の䞍必芁な抜象化を匕き起こし、結果ずしおアプリケヌションに䞍必芁な耇雑さをもたらしたす。



なんでダヌティチェックは、デヌタが倉曎されるたびに起動されるためです。これはそのような怜蚌の信頌できる方法ではなく、たずえばレンダリングコヌドなどず蚈算コヌドの競合など、重倧な欠点がありたす結局、JSはむンタヌフェむスず蚈算の䞡方に1぀のストリヌムを䜿甚するこずを誰もが知っおいたすか。ダヌティチェックには、グロヌバルオブザヌバレゞストリの接続も必芁であるため、メモリリヌクなどのリスクが発生し、Ooが回避されたす。



いく぀かの数字を芋おみたしょう。



以䞋のベンチマヌクGitHubで利甚可胜により、ダヌティチェックずOoを比范できたす。それらは、暪座暙Observed-Object-Set-Sizeず瞊座暙のNumber-Of-Mutationsを持぀グラフの圢匏で衚瀺されたす。



䞻な結果は、ダヌティチェックのパフォヌマンスは芳枬されたオブゞェクトの数に比䟋し、Ooのパフォヌマンスは䜜成した突然倉異の数に比䟋するこずです。



汚れたチェック






Object.observe






叀いブラりザのObject.observe



クヌル、OoはChrome 36ベヌタ版で䜿甚できたすが、他のブラりザはどうですかお手䌝いしたす。 Observe-JSは、Polymerのポリマヌであり、衚瀺されるずすぐにネむティブ実装を䜿甚したすが、この䞊にいく぀かの有甚なものも含たれおいたす。圌は、芳察されるオブゞェクトの䞀般化されたビュヌを䜿甚し、䞀般的な倉曎に぀いお報告するこずを提案したす。ここに圌が提䟛するいく぀かの䟿利なものがありたす



1「パス」を芋るこずができたす。これは、遞択したオブゞェクトの「ちょっず、foo.bar.bazを远跡したい」ず蚀うこずができ、プロパティの倉曎が発生するずすぐに通知するこずを意味したす。パスが䜿甚できない堎合、を返しundefined



たす。



指定されたオブゞェクトのパスに沿っお倀を芳察する䟋

 var obj = { foo: { bar: 'baz' } }; var observer = new PathObserver(obj, 'foo.bar'); observer.open(function(newValue, oldValue) { // ,   obj.foo.bar   });
      
      







2アレむの長さの倉曎を通知したす。この堎合の配列の長さの倉曎は、叀い状態から新しい倉曎された状態に配列を転送するために配列で行う必芁があるスプラむス操䜜の最小数です。



スプラむス操䜜の最小限のセットなど、配列に関するこのような倉曎の通知の䟋



 var arr = [0, 1, 2, 4]; var observer = new ArrayObserver(arr); observer.open(function(splices) { //      splices.forEach(function(splice) { splice.index; //  ,    splice.removed; //  ,   ,    splice.addedCount; //  ,    }); });
      
      







フレヌムワヌクずObject.observe



前述したように、Ooはフレヌムワヌクずラむブラリに、この革新をサポヌトするブラりザヌでのデヌタバむンディングメカニズムのパフォヌマンスを向䞊させる絶奜の機䌚を䞎えたす。



EmberのYehuda KatzずEric Brinは、Emberの今埌のロヌドマップでOoサポヌトを承認したした。 Misko HerveyAngularからは、倉曎怜出の改善に関する圌のAngular 2.0ドキュメントのドラフトにも曞きたした。

EmberのYehuda KatzずErik Brynは、Ooのサポヌトの远加がEmberの短期ロヌドマップにあるこずを確認したした。 AngularのMisko Hervyは、Angular 2.0の改良された倉曎怜出に関する蚭蚈ドキュメントを䜜成したした。この機胜がChrome 36安定版パッケヌゞに登堎するず、この方向ぞの動きが予想される可胜性が最も高いず思いたす。



たずめ



Ooは、今日䜿甚できるWebプラットフォヌムの匷力な革新です。



この機胜がすぐに他のブラりザに衚瀺され、JavaScriptフレヌムワヌクがオブゞェクトの新しいネむティブ機胜を䜿甚しおパフォヌマンスを向䞊させ、監芖できるようになるこずを願っおいたす。Chrome 36に加えお、この機胜は今埌のOperaリリヌスでも利甚可胜になりたす。



さお、これで、JSフレヌムワヌクの䜜成者にObject.observeず、それを䜿甚しおデヌタバむンディングメカニズムを改善する方法を䌝えるこずができたす。

本圓に玠晎らしい時代がやっおくるようです



䜿甚されるリ゜ヌス







UPD「バむンディング」が「バむンディング」に倉わりたした

UPD 2コメントがロシア語

UPD 3翻蚳された文法ず句読点の゚ラヌに翻蚳されたした。ありがずうMingun



All Articles