<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      強大的observejs

      2015-05-07 17:39  【當耐特】  閱讀(5279)  評論(7)    收藏  舉報

      寫在前面

      各大MVVM框架的雙向綁定太難以觀察,很難直觀地從業務代碼里知道發生了什么,我不是雙向綁定的反對者,只是認為雙向綁定不應該糅合進底層框架,而應該出現在業務代碼中,或者是業務和框架之間的代碼上,由開發者實現,由開發者決定觀察什么,決定響應什么。
      以及Object.observe的支持度不夠好(http://caniuse.com/#search=observe)
      再者Object.observe的功能太弱(如對象內數組的變化無法監聽)。
      所以就有了observejs。

      observe.js意義

      • 監聽任意對象的任意數據變化
      • 作為業務和框架之間的中間件存在
      • 作為mv*框架中的監聽模塊(當然我是相當反對)

      3分鐘精通observe.js

      對象字面量

      var obj = { a: 1 };
      //watch obj
      observe(obj, function (name, value) {
          console.log(name + "__" + value);//a__2 
      });
      obj.a = 2;
      

      數組

      var arr = [1, 2, 3];
      //watch obj
      observe(arr, function (name, value, old) {
          console.log(name + "__" + value+"__"+old);
      });
      arr.push(4);//array__push 
      arr[3] = 5;//3__5
      

      復雜對象

      var complexObj = { a: 1, b: 2, c: [{ d: [4] }] };
      //watch complexObj
      observe(complexObj, function (name, value) {
          console.log(name + "__" + value);    //d__100 
      });
      complexObj.c[0].d = 100;
      

      普通對象

      var User = function (name, age) {
          this.name = name;
          this.age = age;
          //watch User's instance
          observe(this, function (name, value, oldValue) {
              console.log(name + "__" + value + "__" + oldValue);//name__wangwu__lisi 
          });
      }
      var user = new User("lisi", 25);
      user.name = "wangwu";
      

      原理

      監聽對象

      利用Object.defineProperty,以及內建 "__屬性名" 來保存真正的 "屬性名" 的值。

      Object.defineProperty(target, prop, {
          get: function () {
              return this["__" + prop];
          },
          set: function (value) {
              self.onPropertyChanged(prop, value, this["__" + prop]);
              this["__" + prop] = value;
                             
          }
      });
      

      監聽數組

          observe.methods = ["concat", "every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "unshift", "valueOf"]
      
          observe.triggerStr = ["concat", "pop", "push", "reverse", "shift", "sort", "splice", "unshift"].join(",")
      observe.methods.forEach(function (item) {
          target[item] = function () {
              var result = Array.prototype[item].apply(this, Array.prototype.slice.call(arguments));
              for (var cprop in this) {
                  if (this.hasOwnProperty(cprop) && cprop != "_super" && !observe.isFunction(this[cprop])) {
                      self.watch(this, cprop);
                  }
              }
              if (new RegExp("\\b" + item + "\\b").test(observe.triggerStr)) {
                  self.onPropertyChanged("array", item, arguments[0]);
              }
              return result;
          };
      });
      

      對Array的所有方法進行了mock,上面的target是被監聽的array,其所有方法被重寫,然后內部執行,執行的過程中,如果屬于edit操作,如concat, pop, push等,都會觸發onPropertyChanged。

      Github

      https://github.com/kmdjs/observejs

      現在開始,請愉快地使用吧!

      This content is released under the (http://opensource.org/licenses/MIT) MIT License.

      主站蜘蛛池模板: 国产一区二区不卡在线视频 | 国产MD视频一区二区三区| av男人的天堂在线观看国产| 亚洲AV成人片不卡无码| 国产不卡一区二区四区| 国产97人人超碰CAO蜜芽PROM| 国产成人亚洲无码淙合青草| 91精品国产自产在线蜜臀| 乱人伦中文视频在线| 狠狠躁夜夜躁人人爽天天5| 亚洲乱码中文字幕综合| 日韩深夜视频在线观看| 2019国产精品青青草原| 亚洲最大的熟女水蜜桃AV网站 | 亚洲午夜久久久久久噜噜噜| 久久九九精品国产免费看小说| 国产乱码精品一区二三区| 4399理论片午午伦夜理片| 国产系列高清精品第一页| 亚洲日韩中文字幕在线播放| 精品无码人妻| 亚洲欧洲精品国产二码| 久久国产精品福利一区二区三区 | 日本一区二区精品色超碰| 一区二区三区不卡国产| 神马久久亚洲一区 二区| 97在线观看视频免费| 丰满无码人妻热妇无码区| 国产精品亚洲二区在线看 | VA在线看国产免费| 国产不卡一区二区在线视频| 亚洲精品乱码久久久久久按摩高清| 久久综合精品成人一本| 二连浩特市| 精品国产大片中文字幕| 色九九视频| 麻豆精产国品一二三产| 999福利激情视频| 性久久久久久| 国产成人亚洲精品在线看| 亚洲欧美日韩成人综合一区|