国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Vue源碼中值得學(xué)習(xí)的方法

開發(fā) 前端
最近在深入研究vue源碼,把學(xué)習(xí)過程中,看到的一些好玩的的函數(shù)方法收集起來做分享,希望對大家對深入學(xué)習(xí)js有所幫助。

最近在深入研究vue源碼,把學(xué)習(xí)過程中,看到的一些好玩的的函數(shù)方法收集起來做分享,希望對大家對深入學(xué)習(xí)js有所幫助。如果大家都能一眼看懂這些函數(shù),說明技術(shù)還是不錯的哦。

[[348906]]

1. 數(shù)據(jù)類型判斷

Object.prototype.toString.call()返回的數(shù)據(jù)格式為 [object Object]類型,然后用slice截取第8位到倒一位,得到結(jié)果為 Object

  1. var _toString = Object.prototype.toString; 
  2. function toRawType (value) { 
  3.   return _toString.call(value).slice(8, -1) 

運行結(jié)果測試

  1. toRawType({}) //  Object  
  2. toRawType([])  // Array     
  3. toRawType(true) // Boolean 
  4. toRawType(undefined) // Undefined 
  5. toRawType(null) // Null 
  6. toRawType(function(){}) // Function 

2. 利用閉包構(gòu)造map緩存數(shù)據(jù)

vue中判斷我們寫的組件名是不是html內(nèi)置標(biāo)簽的時候,如果用數(shù)組類遍歷那么將要循環(huán)很多次獲取結(jié)果,如果把數(shù)組轉(zhuǎn)為對象,把標(biāo)簽名設(shè)置為對象的key,那么不用依次遍歷查找,只需要查找一次就能獲取結(jié)果,提高了查找效率。

  1. function makeMap (str, expectsLowerCase) { 
  2.     // 構(gòu)建閉包集合map 
  3.     var map = Object.create(null); 
  4.     var list = str.split(','); 
  5.     for (var i = 0; i < list.length; i++) { 
  6.       map[list[i]] = true; 
  7.     } 
  8.     return expectsLowerCase 
  9.       ? function (val) { return map[val.toLowerCase()]; } 
  10.       : function (val) { return map[val]; } 
  11. // 利用閉包,每次判斷是否是內(nèi)置標(biāo)簽只需調(diào)用isHTMLTag 
  12. var isHTMLTag = makeMap('html,body,base,head,link,meta,style,title') 
  13. console.log('res', isHTMLTag('body')) // true 

3. 二維數(shù)組扁平化

vue中_createElement格式化傳入的children的時候用到了simpleNormalizeChildren函數(shù),原來是為了拍平數(shù)組,使二維數(shù)組扁平化,類似lodash中的flatten方法。

  1. // 先看lodash中的flatten 
  2. _.flatten([1, [2, [3, [4]], 5]]) 
  3. // 得到結(jié)果為  [1, 2, [3, [4]], 5] 
  4.  
  5. // vue中 
  6. function simpleNormalizeChildren (children) { 
  7.   for (var i = 0; i < children.length; i++) { 
  8.     if (Array.isArray(children[i])) { 
  9.       return Array.prototype.concat.apply([], children) 
  10.     } 
  11.   } 
  12.   return children 
  13.  
  14. // es6中 等價于 
  15. function simpleNormalizeChildren (children) { 
  16.    return [].concat(...children) 

4. 方法攔截

vue中利用Object.defineProperty收集依賴,從而觸發(fā)更新視圖,但是數(shù)組卻無法監(jiān)測到數(shù)據(jù)的變化,但是為什么數(shù)組在使用push pop等方法的時候可以觸發(fā)頁面更新呢,那是因為vue內(nèi)部攔截了這些方法。

  1. // 重寫push等方法,然后再把原型指回原方法 
  2.   var ARRAY_METHOD = [ 'push', 'pop', 'shift', 'unshift', 'reverse',  'sort', 'splice' ]; 
  3.   var array_methods = Object.create(Array.prototype); 
  4.   ARRAY_METHOD.forEach(method => { 
  5.     array_methods[method] = function () { 
  6.       // 攔截方法 
  7.       console.log('調(diào)用的是攔截的 ' + method + ' 方法,進行依賴收集'); 
  8.       return Array.prototype[method].apply(this, arguments); 
  9.     } 
  10.   }); 

運行結(jié)果測試

  1. var arr = [1,2,3] 
  2. arr.__proto__ = array_methods // 改變arr的原型 
  3. arr.unshift(6) // 打印結(jié)果: 調(diào)用的是攔截的 unshift 方法,進行依賴收集 

5. 繼承的實現(xiàn)

vue中調(diào)用Vue.extend實例化組件,Vue.extend就是VueComponent構(gòu)造函數(shù),而VueComponent利用Object.create繼承Vue,所以在平常開發(fā)中Vue 和 Vue.extend區(qū)別不是很大。這邊主要學(xué)習(xí)用es5原生方法實現(xiàn)繼承的,當(dāng)然了,es6中 class類直接用extends繼承。

  1. // 繼承方法  
  2.  function inheritPrototype(Son, Father) { 
  3.    var prototype = Object.create(Father.prototype) 
  4.    prototype.constructor = Son 
  5.    // 把Father.prototype賦值給 Son.prototype 
  6.    Son.prototype = prototype 
  7.  } 
  8.  function Father(name) { 
  9.    this.name = name 
  10.    this.arr = [1,2,3] 
  11.  } 
  12.  Father.prototype.getName = function() { 
  13.    console.log(this.name) 
  14.  } 
  15.  function Son(name, age) { 
  16.    Father.call(this, name) 
  17.    this.age = age 
  18.  } 
  19.  inheritPrototype(Son, Father) 
  20.  Son.prototype.getAge = function() { 
  21.    console.log(this.age) 
  22.  } 

運行結(jié)果測試

  1. var son1 = new Son("AAA", 23) 
  2. son1.getName()            //AAA 
  3. son1.getAge()             //23 
  4. son1.arr.push(4)           
  5. console.log(son1.arr)     //1,2,3,4 
  6.  
  7. var son2 = new Son("BBB", 24) 
  8. son2.getName()            //BBB 
  9. son2.getAge()             //24 
  10. console.log(son2.arr)     //1,2,3 

6. 執(zhí)行一次

once 方法相對比較簡單,直接利用閉包實現(xiàn)就好了

  1. function once (fn) { 
  2.   var called = false
  3.   return function () { 
  4.     if (!called) { 
  5.       called = true
  6.       fn.apply(this, arguments); 
  7.     } 
  8.   } 

7. 淺拷貝

簡單的深拷貝我們可以用 JSON.stringify() 來實現(xiàn),不過vue源碼中的looseEqual 淺拷貝寫的也很有意思,先類型判斷再遞歸調(diào)用,總體也不難,學(xué)一下思路。

  1. function looseEqual (a, b) { 
  2.   if (a === b) { return true } 
  3.   var isObjectisObjectA = isObject(a); 
  4.   var isObjectisObjectB = isObject(b); 
  5.   if (isObjectA && isObjectB) { 
  6.     try { 
  7.       var isArrayA = Array.isArray(a); 
  8.       var isArrayB = Array.isArray(b); 
  9.       if (isArrayA && isArrayB) { 
  10.         return a.length === b.length && a.every(function (e, i) { 
  11.           return looseEqual(e, b[i]) 
  12.         }) 
  13.       } else if (!isArrayA && !isArrayB) { 
  14.         var keysA = Object.keys(a); 
  15.         var keysB = Object.keys(b); 
  16.         return keysA.length === keysB.length && keysA.every(function (key) { 
  17.           return looseEqual(a[key], b[key]) 
  18.         }) 
  19.       } else { 
  20.         /* istanbul ignore next */ 
  21.         return false 
  22.       } 
  23.     } catch (e) { 
  24.       /* istanbul ignore next */ 
  25.       return false 
  26.     } 
  27.   } else if (!isObjectA && !isObjectB) { 
  28.     return String(a) === String(b) 
  29.   } else { 
  30.     return false 
  31.   } 
  32. function isObject (obj) { 
  33.   return obj !== null && typeof obj === 'object' 

 

責(zé)任編輯:趙寧寧 來源: segmentfault
相關(guān)推薦

2020-10-26 10:40:31

Axios前端攔截器

2025-02-25 08:51:19

2022-06-06 07:50:55

PythonJSON

2011-04-15 13:12:09

.NETMEF

2025-07-29 04:00:00

Vue3 庫源碼工具集

2022-09-19 10:07:30

制造業(yè)IT領(lǐng)導(dǎo)者

2023-06-09 10:27:13

Vue開源

2010-03-31 15:52:24

Oracle子查詢

2022-06-28 09:44:21

DevOps軟件開發(fā)

2024-02-19 08:07:31

Go版本語言

2011-08-19 09:41:56

C++

2014-10-30 10:28:09

HTML5

2017-09-10 17:08:11

Java 9程序Oracle

2025-02-28 09:52:19

2015-06-10 09:17:48

數(shù)據(jù)中心規(guī)劃設(shè)計

2010-02-23 09:39:25

DB2 9.7

2021-11-26 05:59:31

Vue3 插件Vue應(yīng)用

2017-12-18 08:55:03

2024-11-18 00:18:18

2020-12-09 11:52:28

Python字符串代碼
點贊
收藏

51CTO技術(shù)棧公眾號

欧美在线观看黄| 在线欧美一级视频| 日本电影一区二区| 亚洲精品视频二区| jizz性欧美10| 一本大道久久精品懂色aⅴ| 久久精品香蕉视频| 国产宾馆实践打屁股91| 欧美在线播放一区| 亚洲视频高清| 国产高清一区视频| 亚洲男女av一区二区| 国产精品wwwwww| 国产精品午夜av| 最近2019中文字幕第三页视频 | 蜜乳av综合| 乱亲女秽乱长久久久| 国产欧美一区二区三区精品酒店| 欧美美女视频在线观看| a黄色在线观看| 欧美日韩一本到| 国产小视频免费在线观看| 激情av一区二区| 青青草观看免费视频在线| 色婷婷综合中文久久一本| 亚州av中文字幕在线免费观看| 欧美性高潮在线| www.黄在线观看| 欧美精品第一页| 岛国av在线播放| 国产午夜精品视频| 亚洲男女网站| 欧美亚洲视频一区二区| 99国产精品一区二区| 国产伦精品一区二区三区照片| 亚洲尤物在线| 91看片淫黄大片91| 国产亚洲一区字幕| 国产一级二级在线| 欧洲亚洲精品在线| aaa在线播放视频| 在线观看不卡av| 深夜激情久久| 国产精品免费视频xxxx| 欧美aa国产视频| 日本精品一区二区三区视频| 麻豆视频观看网址久久| 毛片一区二区三区四区| 五月婷婷综合激情| 蜜乳av综合| 国产精品第3页| 亚洲欧美偷拍三级| xxxxx.日韩| 91视频成人| 一本色道久久综合亚洲91| theporn国产在线精品| 成人自拍性视频| 久久久久国产| 调教视频vk| 亚洲精品在线视频| 成人aaaa免费全部观看| 亚州av电影免费在线观看| 久久蜜桃一区二区| 国产乱色在线观看| 51ⅴ精品国产91久久久久久| 夜色77av精品影院| 国产成人精品一区二区三区| 日韩va欧美va亚洲va久久| 三上悠亚亚洲一区| 日本sm极度另类视频| 国产sm精品调教视频网站| 97人人做人人爽香蕉精品| 亚洲欧美变态国产另类| 成人福利电影精品一区二区在线观看| 日韩一二三区| 色播亚洲婷婷| 精品视频偷偷看在线观看| av激情综合网| 水蜜桃精品av一区二区| 成人福利网站| 亚洲精品日韩精品| 欧美一区二区三区四区五区| 九热爱视频精品视频| 日韩一区二区电影在线观看| 日韩美女av在线| 在线观看免费一区二区| 你懂的av在线| 欧美一区二区三区四区在线| 日韩视频在线观看一区二区| 卡一卡二国产精品| free性欧美| 精品视频一区二区在线| 亚洲第一综合天堂另类专| 日韩成人av在线资源| 可以在线观看的av网站| 91日本在线视频| 亚洲国产欧美一区二区三区丁香婷| 永久免费毛片在线播放| 97视频在线观看成人| 亚洲视频一区二区| 国产精品免费视频网站| 伊人春色之综合网| 日本福利专区在线观看| 六月婷婷激情综合| 日韩成人激情视频| av在线播放不卡| 欧美调教在线| 国产免费永久在线观看| 国产免费一区二区三区四在线播放| 91精品国产福利在线观看| 亚洲视频观看| 亚洲美女炮图| 日本成本人片免费观看| 亚洲在线视频观看| 亚洲成人网在线观看| 欧美日韩在线视频一区| 中文字幕制服丝袜一区二区三区| 成人综合一区| 黑人巨大精品欧美一区二区奶水| 91亚洲国产成人久久精品网站| 在线成人激情视频| 欧美日高清视频| 久久久精品一品道一区| 国产精品国产一区| 一本一本a久久| 久久国产精品偷| 日韩在线观看一区 | 国产av第一区| 欧洲精品在线观看| 国产精品国产三级国产aⅴ入口| 中文字幕第100页| 久久久精品影院| 国产成人免费视频网站高清观看视频 | 亚洲激情成人在线| 福利片在线一区二区| 免费黄色特级片| 欧美极品少妇xxxxⅹ喷水| 欧美国产在线观看| 欧洲亚洲视频| 成人福利视频导航| aa日韩免费精品视频一| 在线精品视频一区二区三四| 一本色道久久综合| 麻豆av在线播放| 久久福利一区二区| 日韩在线不卡视频| 成人18视频在线播放| 国产精品久久久久影院| 欧美91精品久久久久国产性生爱| 成人黄色激情网| 欧美日韩高清一区二区不卡| 久久三级福利| 成人影院av| 男人日女人bb视频| 庆余年2免费日韩剧观看大牛| 一区二区成人在线视频| 亚洲女同中文字幕| 精品国产丝袜高跟鞋| 特级西西444www大精品视频| 亚洲人成在线观看网站高清| 91亚洲永久精品| 国产精品一区高清| 第三区美女视频在线| 欧美二区在线看| 日韩av电影在线免费播放| 欧美激情视频一区二区三区免费| 婷婷在线视频观看| 青青草原网站在线观看| 欧美日产国产成人免费图片| 亚洲一二三区视频在线观看| 亚洲高清网站| www.一区| 中文字幕av高清在线观看| 欧美日韩一区二| 久久影视免费观看| 色婷婷久久一区二区三区麻豆| 精品一区二区三区视频| 欧美调教在线| 综合久久2019| 天天综合网天天做天天受| 国产综合动作在线观看| 久久精品国产精品| 91久久精品网| 99国产精品一区| 激情综合视频| 视频精品一区| 男人在线资源站| 亚洲成人福利在线| 欧美日韩国产综合视频在线| 欧美激情视频播放| 91精品在线观看入口| 日本一区二区三区dvd视频在线| 好吊日精品视频| 黄毛片在线观看| 97精品97| 午夜精品免费在线| 国产精品66部| 欧美日韩三级| 精品久久久久久无码国产| 国产一级特黄a大片免费|