摘要:在中添加一個用來存儲回調函數的變量實現和函數存儲的回調函數做法我是用一個對象去處理的,為屬性名,則是回調函數。
處理深度對象題目地址
源代碼地址
題目有個要求是如果傳入的對象是比較深的對象,也就是 value 可以能是另外一個新的對象,也是要給那個對象的屬性加上 getter 和 setter 的,我的做法就是判斷每一個值是否是對象,然后在做一次遞歸處理。
each(obj) { Object.keys(obj).forEach(key => { // 如果值是一個對象的話 if (Object.prototype.toString.call(obj[key]) === "[object Object]") { // 遞歸自身 this.each(obj[key]) } else { this.convert(key, obj[key]) } }) }
這里用了Object.prototype.toString.call()來判斷值是什么類型,因為使用typeof的話,object、array 和 null 都會返回 object,不是我想要的結果。
實現 $watch題目還有另外一個要求就是實現$watch的功能,用過 Vue 的同學都知道,我們可以用這個函數去監聽一個值的變化,并且傳入一個回調函數,如果值發生變話的話,就執行回調函數。
在constructor中添加一個用來存儲回調函數的變量:
... this.watchProperties = {} ...
實現$watch和emit函數:
存儲 watch 的回調函數做法我是用一個對象去處理的,key 為屬性名,value 則是回調函數。
$watch(name, fn) { this.watchProperties[name] = fn } emit(name, val) { if (this.watchProperties[name] && typeof this.watchProperties[name] === "function") { this.watchProperties[name](val) } }
在convert中添加:
convert(key, value) { ... Object.defineProperty(this.setData || this.data, key, { ... set: function (newValue) { ... // 調用 emit 執行 watchProperties 里的回調函數 // key 為屬性名 // newValue 為新設置的值 that.emit(key, newValue) ... } }) }
最后一步,暴露$watch方法:
constructor(json) { ... return { ... // 這里要注意,修改一下上下文的環境 $watch: this.$watch.bind(this) } }
這里需要使用bind去修改執行的時候上下的環境,否則無法訪問watchProperties。
還沒完成的功能$watch函數不能夠監聽比較深的對象的屬性。
新建一個示例的時候,如果傳入一個深對象,會被打平:
let app = new Observer({ name: { a: 1, b: 2 } }) console.log(app.data) // 會輸出 /* [object Object] { a: 1, b: 2 } */
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81813.html
摘要:實現深層次數據變化如何逐層往上傳播學習過的同學都知道,給一個元素綁定一個事件,這個元素的子元素觸發這個事件,也會同樣會觸發它的所有父元素同樣的事件。 題目地址源代碼地址 處理上個任務的問題 上個任務拋出了兩個問題,一個是在初始化一個實例的時候如果傳一個比較深的對象會被打平。把each和convert做出了一些修改: each(): each(obj, parents = []) { ...
摘要:模板的語法解析匹配實際數據替換模板拆分成兩個主要是為了解決深對象的問題,目前看過別的通過都是通過并不是一個很好的方法。最后修改一下和函數 題目地址源代碼地址 任務分析 這個任務主要是通過解析模板,替換中間出現的屬性,例子: 姓名:{{user.name}} 年齡:{{user.age}} 替換后: 姓名:youngwind 年齡:25 實現 el...
摘要:向已被訪問的鏈接添加樣式。讓背景圖片大小水平方向擴大一倍,這樣才有移動與變化的空間。不足及改進總結來看,自己做得不夠,雖然也花了時間,不過能看出有敷衍的成分在。 一、前言 百度的前端技術學院IFE,2016年就聽說了,當時自己也報名,還組成隊伍了,不過自己一個任務也沒完成就結束了,遺憾... 關注了IFE,知道2017年2月有新的一期培訓,于是一直在等著報名,然后開始做里面發布的任務(...
摘要:向已被訪問的鏈接添加樣式。讓背景圖片大小水平方向擴大一倍,這樣才有移動與變化的空間。不足及改進總結來看,自己做得不夠,雖然也花了時間,不過能看出有敷衍的成分在。 一、前言 百度的前端技術學院IFE,2016年就聽說了,當時自己也報名,還組成隊伍了,不過自己一個任務也沒完成就結束了,遺憾... 關注了IFE,知道2017年2月有新的一期培訓,于是一直在等著報名,然后開始做里面發布的任務(...
摘要:向已被訪問的鏈接添加樣式。讓背景圖片大小水平方向擴大一倍,這樣才有移動與變化的空間。不足及改進總結來看,自己做得不夠,雖然也花了時間,不過能看出有敷衍的成分在。 一、前言 百度的前端技術學院IFE,2016年就聽說了,當時自己也報名,還組成隊伍了,不過自己一個任務也沒完成就結束了,遺憾... 關注了IFE,知道2017年2月有新的一期培訓,于是一直在等著報名,然后開始做里面發布的任務(...
閱讀 2179·2021-11-25 09:43
閱讀 2261·2021-11-24 09:39
閱讀 1555·2021-11-22 12:02
閱讀 2992·2021-11-17 09:33
閱讀 3418·2021-11-15 11:38
閱讀 2744·2021-10-13 09:40
閱讀 1075·2021-09-22 15:41
閱讀 1693·2019-08-30 10:58