馃コ娆㈣繋鎰熷叴瓒g殑鏈嬪弸锛屼竴璧锋潵鍋氱偣鏈夋剰涔夌殑浜嬫儏鍚э紒鏈枃璇戣€咃細閬撻亾閲屾垜鎺ㄥ嚭浜嗕竴涓瘡鍛ㄤ竴娆$殑缈昏瘧椤圭洰锛屼粨搴撳湴鍧€锛岃闂湴鍧€杩樻槸寰堢己蹇楀悓閬撳悎鐨勬湅鍙嬶紝绾睘涓汉鍏磋叮锛屽綋鐒跺鎻愰珮鑻辫鍜屽墠绔妧鑳戒篃鏈夊府鍔╋紝瑕佹眰锛氳嫳鏂囪繕涓嶉敊铔í鐨勶紝鐔熺粌浣跨敤github锛屾湁姣呭姏锛岃唉铏氾紝鍋氫簨璐熻矗銆傛兂鍙備笌鐨勬湅鍙嬪彲浠ョ淇x鎴栬€呯粰浠撳簱鍙慽ssue娑堟伅銆傛垜鐨勫崥瀹篃鏈夊叿浣撶殑涓汉鑱旂郴鏂瑰紡锛歞aodaolee.cn鏈枃浠嬬粛浜嗕竴浜汮avaScript寮曟搸閫氱敤鐨勫叧閿熀纭€鐭ヨ瘑鈥斺€斾笉浠呬粎鏄疺8銆備綔涓篔avaScript寮€鍙戜汉鍛橈紝娣卞叆浜嗚ВJavaScript寮曟搸鐨勫伐浣滃師鐞嗗皢鏈夊姪浜庢偍缂栧啓鏇村ソ鐨勪唬鐮併€傚鏋滄偍杩樻病鏈夐槄璇讳笂涓€绡囨枃绔狅細JavaScript寮曟搸鍩虹锛堜笂锛夛細褰㈡€佸鍜屽唴鑱旂紦瀛橈紝璇烽槄璇汇€傛湰鏂囦腑鏈夊緢澶氱浉鍏虫湳璇湪涓婁竴绡囨枃绔犱腑浠嬬粛杩囥€傚湪涓婁竴绡囨枃绔犱腑锛屾垜浠璁轰簡JavaScript寮曟搸濡備綍閫氳繃浣跨敤褰㈢姸鍜屽唴鑱旂紦瀛樻潵浼樺寲瀵硅薄鍜屾暟缁勮闂€傛湰鏂囧皢璁ㄨ濡備綍浼樺寲绠¢亾鐨勬潈琛★紝骞舵弿杩板紩鎿庡浣曞姞閫熷鍘熷瀷灞炴€х殑璁块棶銆備紭鍖栫骇鍒拰鎵ц鏉冭 涓婁竴绡囨枃绔犺璁轰簡鐜颁唬JavaScript寮曟搸濡備綍鍏锋湁鐩稿悓鐨勭閬擄細鎴戜滑杩樿涓猴紝铏界劧寮曟搸涔嬮棿鐨勯珮绾х閬撴湁浜涚浉浼硷紝浣嗕紭鍖栫閬撶殑杩欎竴鏂归潰閫氬父鏈夋墍涓嶅悓銆傝繖鏄负浠€涔堬紵涓轰粈涔堟湁浜涘紩鎿庢瘮鍏朵粬寮曟搸鏈夋洿澶氱殑浼樺寲绾у埆锛熶簨瀹炶瘉鏄庯紝鍦ㄦ渶蹇殑浠g爜杩愯鏃堕棿鍜屾渶浣虫€ц兘涔嬮棿瀛樺湪鏌愮鏉冭 锛氳В閲婂櫒鍙互蹇€熺敓鎴愬瓧鑺傜爜锛屼絾瀛楄妭鐮侀€氬父鏁堢巼涓嶉珮銆傚彟涓€鏂归潰锛屼紭鍖栫紪璇戝櫒闇€瑕佹洿闀跨殑鎵ц鏃堕棿锛屼絾鏈€缁堜細鐢熸垚鏇撮珮鏁堢殑鏈哄櫒浠g爜銆傝繖姝f槸V8浣跨敤鐨勬ā鍨嬨€俈8鐨勮В閲婂櫒绉颁负Ignition锛屽畠鏄墍鏈夊紩鎿庝腑鏈€蹇殑瑙i噴鍣紙灏卞師濮嬪瓧鑺傜爜鎵ц閫熷害鑰岃█锛夈€俈8鐨勪紭鍖栫紪璇戝櫒绉颁负TurboFan锛屽畠鏈€缁堜細鐢熸垚楂樺害浼樺寲鐨勬満鍣ㄤ唬鐮侊細鍚姩寤惰繜鍜屾墽琛岄€熷害涔嬮棿鐨勬潈琛℃槸涓€浜汮avaScript寮曟搸閫夋嫨鍦ㄤ袱鑰呬箣闂存坊鍔犱紭鍖栧眰鐨勫師鍥犮€備緥濡傦紝SpiderMonkey鍦ㄨВ閲婂櫒鍜孖onMonkey浼樺寲缂栬瘧鍣ㄤ箣闂村鍔犱簡涓€涓熀绾垮眰锛氳В閲婂櫒鐢熸垚瀛楄妭鐮侀€熷害寰堝揩锛屼絾瀛楄妭鐮佹墽琛岄€熷害鐩稿杈冩參銆侭aseline鐢熸垚浠g爜鐨勬椂闂存洿闀匡紝浣嗗畠鎻愪緵浜嗘洿濂界殑杩愯鏃舵€ц兘銆傛渶鍚庯紝IonMonkey浼樺寲缂栬瘧鍣ㄧ敓鎴愭満鍣ㄧ爜鐨勬椂闂存渶闀匡紝浣嗚繍琛屾晥鐜囧緢楂樸€傝鎴戜滑鐪嬩竴涓叿浣撶殑渚嬪瓙锛岀湅鐪嬩笉鍚屽紩鎿庝腑鐨勭閬撴槸濡備綍澶勭悊鐨勩€備笅闈㈡槸涓€浜涘湪鐑惊鐜腑缁忓父閲嶅鐨勪唬鐮侊細letresult=0;for(leti=0;i<4242424242;++i){result+=i;}console.log(result);(Ignition)鍦ㄨВ閲婂櫒涓繍琛屽瓧鑺傜爜銆傚湪鏌愪釜鏃跺€欙紝寮曟搸纭畾浠g爜宸茶揪鍒拌繃鐑偣锛屽苟鍚姩TurboFan锛岃繖鏄疶urboFan鐨勪竴閮ㄥ垎锛岃礋璐i泦鎴愬垎鏋愭暟鎹拰鏋勫缓浠g爜鐨勫熀鏈満鍣ㄨ〃绀恒€傜劧鍚庡畠琚彂閫佸埌涓嶅悓绾跨▼涓婄殑TurboFan浼樺寲鍣ㄨ繘琛岃繘涓€姝ョ粏鍖栵細褰撲紭鍖栧櫒杩愯鏃讹紝V8缁х画鍦↖gnition涓墽琛屽瓧鑺傜爜銆傚湪鏌愪釜鏃跺€欎紭鍖栧櫒瀹屾垚锛屾垜浠湁鍙墽琛岀殑鏈哄櫒浠g爜锛屽苟涓斿彲浠ョ户缁墽琛屻€備粠Chrome91锛?021骞村彂甯冿級寮€濮嬶紝V8鍦↖gnition瑙i噴鍣ㄥ拰TurboFan浼樺寲缂栬瘧鍣ㄤ箣闂村鍔犱簡涓€涓悕涓篠parkplug鐨勭紪璇戝櫒銆係piderMonkey寮曟搸涔熷紑濮嬪湪瑙i噴鍣ㄤ腑杩愯瀛楄妭鐮併€備絾鏄畠澶氫簡涓€涓猙aselayer锛屼篃灏辨槸璇寸儹浠g爜鍏堥€佸埌baselayer锛宐asecompiler鍦ㄤ富绾跨▼涓婄敓鎴恇asecode锛屽噯澶囧ソ鍚庣户缁墽琛屻€傚熀鍑嗕唬鐮佽繍琛屼竴娈垫椂闂村悗锛孲piderMonkey鏈€缁堜細鍚姩IonMonkey锛屽苟鍚姩浼樺寲鍣ㄢ€斺€斾笌V8闈炲父鐩镐技銆侷onMonkey鍦ㄤ紭鍖栫殑鍚屾椂锛岀户缁湪鍩虹嚎灞傝繍琛屻€傛渶鍚庯紝褰撲紭鍖栧櫒瀹屾垚鏃讹紝灏嗘墽琛屼紭鍖栦唬鐮佽€屼笉鏄熀鍑嗕唬鐮併€侰hakra鐨勬灦鏋勪笌SpiderMonkey鐨勯潪甯哥浉浼硷紝浣咰hakra浼氬皾璇曚竴娆¤繍琛屾洿澶氱殑涓滆タ浠ラ伩鍏嶉樆濉炰富绾跨▼銆侰hakra涓嶆槸鍦ㄤ富绾跨▼涓婅繍琛岀紪璇戝櫒鐨勪换浣曢儴鍒嗭紝鑰屾槸澶嶅埗鍑虹紪璇戝櫒鍙兘闇€瑕佺殑瀛楄妭鐮佸拰鏁版嵁锛屽苟灏嗗叾鍙戦€佸埌涓撶敤鐨勭紪璇戝櫒杩涚▼锛氬綋鐢熸垚鐨勪唬鐮佸噯澶囧氨缁椂锛屽紩鎿庡紑濮嬭繍琛屾SimpleJIT浠g爜鑰屼笉鏄瓧鑺傜爜.FullJIT涔熸槸濡傛銆傝繖绉嶆柟娉曠殑濂藉鏄笌杩愯FullJIT缂栬瘧鍣ㄦ椂鐩告瘮锛屽鍒剁殑鏆傚仠鏃堕棿閫氬父瑕佺煭寰楀銆備絾杩欑鏂规硶鐨勭己鐐规槸杩欑澶嶅埗鍙兘浼氫涪澶辨煇浜涗紭鍖栨墍闇€鐨勪俊鎭紝鍥犳瀹冧細鍦ㄤ竴瀹氱▼搴︿笂鐗虹壊浠g爜璐ㄩ噺浠ユ崲鍙栧欢杩熴€傚湪JavaScriptCore涓紝鎵€鏈変紭鍖栫紪璇戝櫒閮戒笌涓荤嚎绋婮avaScript瀹屽叏骞跺彂杩愯锛岃娉ㄦ剰锛佽繖閲岀姝㈠鍒讹紒鐩稿弽锛屼富绾跨▼鍙槸鍦ㄥ彟涓€涓嚎绋嬩笂瑙﹀彂缂栬瘧浣滀笟銆傜紪璇戝櫒鐒跺悗浣跨敤澶嶆潅鐨勯攣瀹氭柟妗堜粠涓荤嚎绋嬭闂垎鏋愭暟鎹細杩欑鏂规硶鐨勪紭鐐规槸鍑忓皯浜嗙敱浜嶫avaScript浼樺寲鑰屽鑷寸殑涓荤嚎绋嬩笂鐨勫崱椤匡紝缂虹偣鏄畠闇€瑕佸鐞嗗鏉傜殑鎿嶄綔浠樺嚭涓€浜涗唬浠烽攣瀹氭垚鏈€傚埌鐩墠涓烘锛屾垜浠凡缁忚璁轰簡浣跨敤瑙i噴鍣ㄥ揩閫熺敓鎴愪唬鐮佹垨浣跨敤浼樺寲缂栬瘧鍣ㄥ揩閫熺敓鎴愪唬鐮佷箣闂寸殑鏉冭 銆備絾鏄繕鏈夊彟涓€涓潈琛★細鍐呭瓨浣跨敤锛佷负浜嗚鏄庤繖涓€鐐癸紝涓嬮潰鏄竴涓皢涓や釜鏁板瓧鐩稿姞鐨勪唬鐮佺ず渚嬶細functionadd(x,y){returnx+y;}add(1,2);杩欐槸瑙i噴浜嗗湪V8涓娇鐢↖gnitionadd鍑芥暟鐨勫姞娉曞櫒鐢熸垚鐨勫瓧鑺傜爜锛歋tackCheckLdara1Adda0,[0]Return涓嶉渶瑕佸畬鍏ㄧ悊瑙e瓧鑺傜爜锛屽緢瀹规槗鐪嬪嚭瀹冨彧鏈夊洓鏉℃寚浠ゃ€傚綋浠g爜鐘舵€佸彉鐑椂锛孴urboFan浼氱敓鎴愬涓嬮珮搴︿紭鍖栫殑鏈哄櫒鐮侊細leaqrcx,[rip+0x0]movqrcx,[rcx-0x37]testb[rcx+0xf],0x1jnzCompileLazyDeoptimizedCodepushrbpmovqrbp,rsppushrsipushrdicmpqrsp,[r13+0xe88]jnaStackOverflowmovqrax锛孾rbp+0x18]testal锛?x1jnzDeoptimizemovqrbx锛孾rbp+0x10]testbrbx锛?x1jnzDeoptimizemovqrdx锛宺bxshrqrdx锛?2movqrcx锛宺axshrqrcx锛?2addlrdx锛宺cxjoDeoptimizeshl2rdxrax,rdxmovqrsp,rbppoprbpret0x18鍝囷紝杩欎箞澶氬瓧鑺傜爜锛佷竴鑸潵璇达紝瀛楄妭鐮佸線寰€姣旀満鍣ㄧ爜鏇寸揣鍑戯紝灏ゅ叾鏄紭鍖栧悗鐨勬満鍣ㄧ爜銆傚彟涓€鏂归潰锛屽瓧鑺傜爜闇€瑕佽В閲婂櫒鎵嶈兘杩愯锛岃€屼紭鍖栧悗鐨勪唬鐮佸彲浠ョ洿鎺ョ敱澶勭悊鍣ㄦ墽琛屻€傝繖灏辨槸涓轰粈涔圝avaScript寮曟搸涓嶅彧鏄€滀紭鍖栨墍鏈変唬鐮佲€濄€傛濡傛垜浠箣鍓嶇湅鍒扮殑锛岀敓鎴愪紭鍖栫殑鏈哄櫒浠g爜闇€瑕佸緢闀挎椂闂达紝闄ゆ涔嬪锛屾垜浠垰鍒氫簡瑙e埌浼樺寲鐨勬満鍣ㄤ唬鐮佷篃闇€瑕佹洿澶氱殑鍐呭瓨銆傛€荤粨锛欽avaScript寮曟搸涔嬫墍浠ユ湁杩欎箞澶氬眰鐨勪紭鍖栵紝鏄洜涓洪渶瑕佷娇鐢ㄨВ閲婂櫒鐢熸垚蹇€熶唬鐮侊紝闇€瑕佷娇鐢ㄤ紭鍖栫紪璇戝櫒鐢熸垚蹇€熶唬鐮併€傝繖鏄竴涓寖鍥寸晫瀹氱殑浜嬫儏锛屾坊鍔犳洿澶氫紭鍖栧眰鍏佽鎮ㄥ湪棰濆鐨勫鏉傛€?寮€閿€鍜屾洿缁嗙矑搴︾殑鍐崇瓥涔嬮棿鍋氬嚭閫夋嫨銆傛澶栵紝鍦ㄤ紭鍖栫骇鍒拰鐢熸垚浠g爜鐨勫唴瀛樹娇鐢ㄤ箣闂村瓨鍦ㄦ潈琛°€傝繖灏辨槸涓轰粈涔圝avaScript寮曟搸璇曞浘鍙紭鍖栫儹闂ㄥ嚱鏁般€備笂涓€绡囨枃绔犱紭鍖栧師鍨嬪睘鎬ц闂В閲婁簡JavaScript寮曟搸濡備綍浣跨敤褰㈢姸鍜孖C浼樺寲瀵硅薄灞炴€у姞杞姐€傛鎷湴璇达紝寮曟搸灏嗗璞$殑褰㈢姸涓庡璞$殑鍊煎垎寮€瀛樺偍锛氬舰鐘舵敮鎸佺О涓哄唴鑱旂紦瀛?IC)鐨勪紭鍖栥€係hapes鍜孖C鐩哥粨鍚堝彲浠ュ姞閫熶唬鐮佷腑鍚屼竴浣嶇疆鐨勯噸澶嶅睘鎬ц闂€傜被鍜屽熀浜庡師鍨嬬殑缂栫▼鐜板湪鎴戜滑鐭ラ亾浜嗗浣曞揩閫熻闂甁avaScript瀵硅薄鐨勫睘鎬э紝璁╂垜浠湅涓€涓婮avaScript鐨勬渶鏂版坊鍔犱箣涓€锛氱被銆侸avaScript绫昏娉曞涓嬫墍绀猴細classBar{constructor(x){this.x=x;}getX(){杩斿洖this.x;}}铏界劧杩欏湪JavaScript涓技涔庢槸涓€涓柊姒傚康锛屼絾瀹冨彧鏄熀浜庡師鍨嬬殑缂栫▼璇硶绯栵紝鍦↗avaScript涓竴鐩翠娇鐢細functionBar(x){this.x=x;}Bar.prototype.getX=鍑芥暟getX(){杩斿洖this.x;};杩欓噷鎴戜滑鍦˙ar.prototype瀵硅薄涓婂垎閰嶄簡涓€涓猤etX灞炴€с€傝繖涓庝换浣曞叾浠栧璞″畬鍏ㄤ竴鏍凤紝鍥犱负鍘熷瀷鍦↗avaScript涓篃鍙槸瀵硅薄锛佸湪鍍廕avaScript杩欐牱鐨勫熀浜庡師鍨嬬殑缂栫▼璇█瀹舵棌涓紝鏂规硶閫氳繃鍘熷瀷鍏变韩锛岃€屽瓧娈靛瓨鍌ㄥ湪鍏蜂綋瀹炰緥涓€傜湅鐪嬪綋鎴戜滑鍒涘缓涓€涓悕涓篺oo鐨勬柊Bar瀹炰緥鏃跺箷鍚庡彂鐢熶簡浠€涔堬細constfoo=newBar(true);杩愯涓婇潰鐨勪唬鐮佷細鍒涘缓涓€涓叿鏈夊崟涓睘鎬р€渪鈥濈殑Shape瀹炰緥銆俧oo鐨勫師鍨嬫槸Bar绫荤殑Bar.prototype锛欱ar.prototype鏈夎嚜宸辩殑Shape骞跺寘鍚竴涓睘鎬р€済etX鈥濓紝鍏跺€间负鍑芥暟getX锛岃皟鐢ㄦ椂鍙繑鍥瀟his.x銆侭ar.prototype鐨勫師鍨嬫槸JavaScript璇█鐨凮bject.prototype銆侽bject.prototype鏄師鍨嬫爲鐨勬牴锛屾墍浠ュ畠鐨勫師鍨嬩负绌恒€傚鏋滄偍鍒涘缓鍙︿竴涓被鐨勫彟涓€涓疄渚嬶紝鍦ㄦ垜浠箣鍓嶈璁虹殑鎯呭喌涓嬶紝涓や釜瀹炰緥鍏变韩瀵硅薄Shape锛氫袱涓疄渚嬮兘鎸囧悜鍚屼竴涓狟ar.prototype瀵硅薄銆傚師鍨嬪睘鎬ц闂ソ鐨勶紝鐜板湪鎴戜滑鐭ラ亾褰撴垜浠畾涔変竴涓被骞跺垱寤轰竴涓柊瀹炰緥鏃朵細鍙戠敓浠€涔堛€備絾鏄鏋滄垜浠湪涓€涓疄渚嬩笂璋冪敤涓€涓柟娉曚細鍙戠敓浠€涔堬紵绫籅ar{constructor(x){this.x=x;}getX(){杩斿洖this.x;}}constfoo=newBar(true);constx=foo.getX();//^^^^^^^^^^鎴戜滑鎷嗗垎涓€涓嬶細constx=foo.getX();//鍏跺疄灏辨槸涓ゆconst$getX=foo.getX;constx=$getX.call(foo);绗?姝ユ槸load鏂规硶锛屽畠鍙槸鍘熷瀷涓婄殑涓€涓睘鎬э紙鍏跺€兼伆濂芥槸涓€涓嚱鏁帮級锛岀2姝ユ槸浣跨敤鍊间负this鐨勫疄渚嬭皟鐢ㄨ鍑芥暟銆傛垜浠湅绗竴姝ワ紝浠庡疄渚媐oo鍔犺浇鏂规硶getX锛氬紩鎿庝粠foo瀹炰緥寮€濮嬶紝鍙戠幇foo鐨凷hape涓婃病鏈?getX'灞炴€э紝鍥犳瀹冨繀椤婚亶鍘嗗師鍨嬮摼銆傛垜浠埌杈綛ar.prototype锛屾煡鐪嬪叾鍘熷瀷Shape锛屽苟鐪嬪埌瀹冨湪鍋忕Щ閲?澶勬湁涓€涓€済etX鈥濆睘鎬с€傛垜浠湪Bar.prototype涓煡鎵炬鍋忕Щ閲忓鐨勫€煎苟鎵惧埌鎴戜滑姝e湪瀵绘壘鐨凧SFunctiongetX銆傛暣涓繃绋嬪氨鏄繖鏍凤紒JavaScript鍙互浠ュ叾鐙壒鐨勭伒娲绘€ф敼鍙樺師鍨嬮摼閾炬帴锛屼緥濡傦細constfoo=newBar(true);foo.getX();//鈫抰rueObject.setPrototypeOf(foo,null);foo.getX();//鈫扷ncaughtTypeError:foo.getXisnotafunction鍦ㄨ繖涓緥瀛愪腑锛屾垜浠皟鐢ㄤ簡涓ゆfoo.getX()锛屼絾姣忔閮芥湁瀹屽叏涓嶅悓鐨勫惈涔夊拰缁撴灉銆傝繖灏辨槸涓轰粈涔堬紵铏界劧鍘熷瀷鍙槸JavaScript涓殑瀵硅薄锛屼絾瀵逛簬JavaScript寮曟搸鏉ヨ锛屽姞閫熷師鍨嬪睘鎬ц闂瘮鍔犻€熷甯歌瀵硅薄鑷韩灞炴€х殑璁块棶瑕佸洶闅惧緱澶氥€傜湅杩欐浠g爜锛屽姞杞藉師鍨嬪睘鎬ф槸涓€涓潪甯搁绻佺殑鎿嶄綔锛氭瘡娆¤皟鐢ㄦ柟娉曟椂閮戒細鍙戠敓锛佺被Bar{constructor(x){this.x=x;}getX(){杩斿洖this.x;}}constfoo=newBar(true);constx=foo.getX();//^^^^^^^^^^鏃╀簺鏃跺€欙紝鎴戜滑璁ㄨ浜嗗紩鎿庡浣曢€氳繃浣跨敤Shape浼樺寲鍔犺浇甯歌鐨勮嚜鏈夊睘鎬у拰鍐呰仈缂撳瓨銆傞偅涔堝浜嶴hape鐩镐技鐨勫璞★紝鎴戜滑濡備綍浼樺寲鍘熷瀷灞炴€х殑閲嶅鍔犺浇鍛紵鍦ㄤ笂鍥句腑锛屾垜浠湅鍒颁簡灞炴€у姞杞芥槸濡備綍鍙戠敓鐨勶細涓轰簡鍦ㄨ繖绉嶇壒娈婃儏鍐典笅鍔犲揩閲嶅鍔犺浇锛屾垜浠渶瑕佺煡閬撲笁浠朵簨锛歠oo鐨凷hape涓嶅寘鍚€済etX鈥濆苟涓旀病鏈夎繘琛屼换浣曟洿鏀广€傝繖鎰忓懗鐫€娌℃湁浜洪€氳繃娣诲姞銆佸垹闄ゆ垨鏇存敼灞炴€ф潵鏇存敼瀵硅薄foo銆俧oo鐨勫師鍨嬭繕鏄師鏉ョ殑Bar.prototype銆傝繖鎰忓懗鐫€娌℃湁浜洪€氳繃浣跨敤Object.setPrototypeOf()鎴栭€氳繃璁剧疆鐗规畩鐨刜_proto__灞炴€ф潵鏇存敼foo鍘熷瀷銆侭ar.prototype鐨凷hape鍖呭惈鈥済etX鈥濆苟涓旀病鏈夊彉鍖栥€傝繖鎰忓懗鐫€娌℃湁浜洪€氳繃娣诲姞銆佸垹闄ゆ垨鏇存敼灞炴€ф潵淇敼Bar.prototype銆傚湪涓€鑸儏鍐典笅锛岃繖鎰忓懗鐫€鎴戜滑蹇呴』瀵瑰疄渚嬫湰韬墽琛?娆℃鏌ワ紝骞跺姣忎釜鍘熷瀷鎵ц2娆℃鏌ワ紝鐩村埌鍘熷瀷鍏锋湁鎴戜滑瑕佹煡鎵剧殑灞炴€с€傚湪杩欑鎯呭喌涓嬶紝1+2N妫€鏌ワ紙鍏朵腑N鏄秹鍙婄殑鍘熷瀷鏁伴噺锛夊彲鑳藉惉璧锋潵杩樹笉閿欙紝鍥犱负鍘熷瀷閾剧浉瀵硅緝娴呪€斺€斾絾寮曟搸閫氬父蹇呴』澶勭悊鏇撮暱鐨勫師鍨嬮摼锛屼緥濡傚湪甯歌鐨凞OM妗堜緥绫讳腑銆傚儚杩欎釜渚嬪瓙锛歝onstanchor=document.createElement('a');//鈫扝TMLAnchorElementconsttitle=anchor.getAttribute('title');鎴戜滑鏈変竴涓狧TMLAnchorElement骞跺湪鍏朵笂璋冪敤getAttribute()鏂规硶銆傝繖娑夊強鍒?涓師鍨嬶紒澶у鏁颁笉閿欑殑DOM鏂规硶涓嶅湪鐩存帴鐨凥TMLAnchorElement鍘熷瀷涓婏紝鑰屾槸鍦ㄩ摼鐨勪笂灞傦細getAttribute()鏂规硶鍙互鍦‥lement.prototype涓婃壘鍒般€傝繖鎰忓懗鐫€姣忔鎴戜滑璋冪敤anchor.getAttribute()鏃讹紝JavaScript寮曟搸閮介渶瑕佸仛......妫€鏌モ€済etAttribute鈥濇槸鍚︿笉鍦ㄩ敋瀵硅薄鏈韩涓婃鏌ョ洿鎺ュ師鍨嬫槸HTMLAnchorElement.prototype纭繚娌℃湁鈥済etAttribute鈥濇鏌ヤ笅涓€涓師鍨嬫槸HTMLElement.prototype纭繚閭i噷涔熸病鏈夆€済etAttribute鈥濇渶鍚庢鏌ヤ笅涓€涓師鍨嬫槸Element.prototype骞朵笖閭i噷鏈夆€済etAttribute鈥濇€诲叡7涓鏌ワ紒杩欑浠g爜鍦ㄧ綉缁滀笂寰堝父瑙侊紝寮曟搸搴旂敤浜嗕竴浜涙妧宸ф潵鍑忓皯鍘熷瀷涓婂睘鎬у姞杞芥墍闇€鐨勬鏌ユ鏁般€傚洖鍒板墠闈㈢殑渚嬪瓙锛屽綋璁块棶foo涓婄殑'getX'鏃讹紝鎴戜滑鎬诲叡鎵ц浜?娆℃鏌ワ細classBar{constructor(x){this.x=x;}getX(){杩斿洖this.x;}}constfoo=newBar(true);const$getX=foo.getX;姣忎釜甯︽湁璇ュ睘鎬х殑鍘熷瀷瀵硅薄閮介渶瑕佹鏌hape鏄惁缂哄け銆傚鏋滄垜浠彲浠ラ€氳繃灏嗗師鍨嬫鏌ュ彉鎴愮己鍕ゆ鏌ユ潵鍑忓皯妫€鏌ユ鏁帮紝閭e氨澶ソ浜嗐€傛湰璐ㄤ笂锛岃繖灏辨槸寮曟搸鐢ㄤ竴涓畝鍗曠殑鎶€宸ф墍鍋氱殑浜嬫儏锛氬紩鎿庝笉鏄皢鍘熷瀷閾惧瓨鍌ㄥ湪瀹炰緥鏈韩涓婏紝鑰屾槸灏嗗叾瀛樺偍鍦⊿hape涓€傛瘡涓猄hape鎸囧悜涓€涓師鍨嬨€傝繖涔熸剰鍛崇潃姣忔foo鐨勫師鍨嬪彂鐢熷彉鍖栨椂锛屽紩鎿庨兘浼氬垏鎹㈠埌鏂扮殑Shape銆傜幇鍦ㄦ垜浠彧闇€瑕佹鏌ュ璞$殑Shape浠ユ柇瑷€鏌愪簺灞炴€ф槸鍚︿涪澶卞苟淇濇姢鍘熷瀷閾炬帴銆傞€氳繃杩欑鏂规硶锛屾垜浠彲浠ュ皢鎵€闇€鐨勬鏌ユ鏁颁粠1+2N鍑忓皯鍒?+N锛屼互渚挎洿蹇湴璁块棶鍘熷瀷鐨勫睘鎬с€備絾杩欑鏂规硶骞朵笉渚垮疁锛屽師鍨嬮摼瓒婇暱锛屾垚鏈秺楂樸€傚紩鎿庨噰鐢ㄤ笉鍚岀殑鎶€宸ф潵杩涗竴姝ュ噺灏戞鏌ユ鏁帮紝鐗瑰埆鏄浜庣浉鍚屽睘鎬у姞杞界殑鍚庣画鎵ц銆傛湁鏁堟€у崟鍏冩牸锛圴alidityCell锛塚8涓撻棬閽堝杩欎釜鍘熷瀷Shape杩涜浜嗗鐞嗐€傛瘡涓師鍨嬮兘鏈変竴涓敮涓€鐨凷hape锛屽畠涓嶄笌浠讳綍鍏朵粬瀵硅薄鍏变韩锛堢壒鍒槸涓嶄笌鍏朵粬鍘熷瀷鍏变韩锛夛紝骞朵笖姣忎釜鍘熷瀷Shapes閮芥湁涓€涓笌涔嬪叧鑱旂殑鐗规畩鏈夋晥鍗曞厓鏍硷紙ValidityCell锛夈€傚彧瑕佹湁浜烘洿鏀圭浉鍏冲師鍨嬫垨瀹冧笂闈㈢殑浠讳綍鍘熷瀷锛屾ValidityCell灏变細澶辨晥銆傝鎴戜滑鐪嬬湅瀹冩槸濡備綍宸ヤ綔鐨勩€備负浜嗗姞蹇悗缁師鍨嬬殑鍔犺浇閫熷害锛孷8鏀剧疆浜嗕竴涓寘鍚洓涓瓧娈电殑鍐呰仈缂撳瓨锛氾紙褰撳墠涓築ar.prototype锛夛紝瀹炰緥鐨凷hape锛堝綋鍓嶄负foo鐨凷hape锛夛紝浠ュ強浠庡疄渚婼hape鍒扮洿鎺ュ師鍨嬬殑褰撳墠ValidityCell鐨勯摼鎺ワ紙褰撳墠涓築ar.prototype锛夈€備笅娆″懡涓唴鑱旂紦瀛樻椂锛屽紩鎿庡繀椤绘鏌ュ疄渚嬬殑Shape鍜孷alidityCell銆傚鏋滀粛鐒舵湁鏁堬紝寮曟搸鍙互鐩存帴璁块棶鍘熷瀷涓婄殑鍋忕Щ閲忥紝璺宠繃棰濆鐨勬煡鎵撅細褰撳師鍨嬪彂鐢熷彉鍖栨椂锛屽垎閰嶄竴涓柊鐨凷hape锛岃€屼箣鍓嶇殑ValidityCell鍙樺緱鏃犳晥銆傛墍浠nlineCache浼氬湪涓嬫鎵ц鏃朵涪澶憋紝瀵艰嚧鎬ц兘涓嶄匠銆傚洖鍒板墠闈OM鍏冪礌鐨勪緥瀛愶紝杩欐剰鍛崇潃瀵逛簬Object.prototype锛屼笉浠匫bject.prototype鏈韩鐨勫唴鑱旂紦瀛樹細澶辨晥锛屼笅闈㈢殑浠讳綍鍘熷瀷涔熶細澶辨晥锛屽寘鎷珽ventTarget.prototype锛孨ode.prototype锛孍lement.prototype绛夌瓑锛屼竴鐩村埌HTMLAnchorElement.prototype锛氬疄闄呬笂锛屽湪杩愯浠g爜鏃朵慨鏀筄bject.prototype鎰忓懗鐫€鎬ц兘涓嶆槸浼樺厛鑰冭檻鐨勩€傚敖閲忎笉瑕佽繖鏍峰仛锛佽鎴戜滑鐢ㄤ竴涓叿浣撶殑渚嬪瓙杩涗竴姝ユ帰璁ㄨ繖涓棶棰樸€傚亣璁炬垜浠湁涓€涓狟ar绫伙紝鎴戜滑鏈変竴涓皟鐢˙ar瀵硅薄鏂规硶鐨勫嚱鏁發oadX銆傛垜浠娇鐢ㄥ悓涓€绫荤殑瀹炰緥澶氭璋冪敤姝oadX鍑芥暟锛歝lassBar{/*...*/}functionloadX(bar){returnbar.getX();//Bar瀹炰緥涓奼etX鐨処C銆倉loadX(newBar(true));loadX(newBar(false));//loadX涓殑IC鐜板湪閾炬帴Bar.prototype鐨刅alidityCell銆侽bject.prototype.newMethod=y=>y;//loadXIC涓殑ValidityCell鐜板湪鏃犳晥锛?/鍥犱负Object.prototype宸叉洿鏀广€俵oadX涓殑鍐呰仈缂撳瓨鐜板湪鎸囧悜Bar.prototype鐨刅alidityCell銆傚鏋滀綘涔嬪悗鍋氫簡涓€浜涚被浼兼敼鍙極bject.prototype鐨勪簨鎯呫€俈alidityCell澶辨晥锛屼笅涓€娆″懡涓椂鐜版湁鐨勫唴鑱旂紦瀛樹涪澶憋紝瀵艰嚧鎬ц兘涓嶄匠銆傚敖閲忎笉瑕佹洿鏀筄bject.prototype锛屽洜涓哄畠浼氫娇寮曟搸鍦ㄨ繖涔嬪墠鏀剧疆鐨勫師鍨嬪姞杞界殑浠讳綍鍐呰仈缂撳瓨澶辨晥銆傝繖鏄敊璇殑鍙︿竴涓緥瀛愶細Object.prototype.foo=function(){/*...*/};someObject.foo();鍒犻櫎Object.prototype.foo锛涙垜浠墿灞曚簡Object.prototype锛岃繖浣垮緱寮曟搸鍦ㄨ繖閲屼箣鍓嶆斁缃殑浠讳綍鍘熷瀷鍐呰仈缂撳瓨閮藉け鏁堜簡銆傜劧鍚庢垜浠繍琛屼竴浜涗娇鐢ㄦ柊鍘熷瀷鏂规硶鐨勪唬鐮併€傚紩鎿庡繀椤讳粠澶村紑濮嬪苟涓烘墍鏈夊師鍨嬪睘鎬ц闂缃竴涓柊鐨勫唴鑱旂紦瀛樸€傛渶鍚庯紝鎴戜滑鈥滄竻鐞嗚嚜宸扁€濆苟鍒犻櫎鎴戜滑涔嬪墠娣诲姞鐨勫師鍨嬫柟娉曘€傗€滆嚜鎴戞竻娲佲€濅技涔庢槸涓ソ涓绘剰锛屼絾鍦ㄨ繖绉嶆儏鍐典笅锛屽畠浼氳浜嬫儏鍙樺緱鏇寸碂锛佸垹闄ゆ灞炴€т細淇敼Object.prototype锛屽洜姝ゆ墍鏈夊唴鑱旂紦瀛樺啀娆″け鏁堬紝寮曟搸蹇呴』鍐嶆浠庡ご寮€濮嬨€傛€荤粨锛氳櫧鐒跺師鍨嬪彧鏄璞★紝浣嗗畠浠JavaScript寮曟搸鐗规畩瀵瑰緟锛屼互浼樺寲鍘熷瀷涓婃柟娉曟煡鎵剧殑鎬ц兘銆傚繕鎺変綘鐨勫師鍨嬪惂锛佹垨鑰咃紝濡傛灉鎮ㄧ‘瀹為渶瑕佷慨鏀瑰師鍨嬶紝璇峰湪鍏朵綑浠g爜杩愯涔嬪墠杩涜锛岃繖鏍锋偍鑷冲皯涓嶄細鍦ㄤ唬鐮佽繍琛屾椂浣垮紩鎿庝腑鐨勬墍鏈変紭鍖栨棤鏁堛€傛渶鍚庯紝鎴戜滑浜嗚В浜咼avaScript寮曟搸濡備綍瀛樺偍瀵硅薄鍜岀被锛屼互鍙婂舰鐘躲€佸唴鑱旂紦瀛樺拰ValidityCells濡備綍甯姪浼樺寲鍘熷瀷鎿嶄綔銆傚熀浜庤繖浜涚煡璇嗭紝鎴戜滑纭畾浜嗕竴涓湁鍔╀簬鎻愰珮鎬ц兘鐨勫疄鐢↗avaScript缂栫爜鎶€宸э細涓嶈寮勪贡鍘熷瀷锛堟垨鑰呭鏋滀綘鐪熺殑銆佺湡鐨勯渶瑕侊紝鑷冲皯鍦ㄥ叾浠栦唬鐮佽繍琛屼箣鍓嶈繖鏍峰仛锛夈€傜浉鍏宠祫鏂橨avaScriptenginefundamentals:optimizingprototypes缈昏瘧鏂规鍘熸枃
