当前位置: 首页 > Web前端 > JavaScript

day44元编程:通过代理和反射启用元编程

时间:2023-03-27 10:04:07 JavaScript

浠婂ぉ鎴戜滑鍐嶆潵鐪嬬湅鈥滃厓鈥濈紪绋嬨€傞偅涔堬紝鍏冪紪绋嬩腑鐨勨€滃厓鈥濅唬琛ㄤ粈涔堬紵鈥滃厓鈥濇湁鈥滈珮浜庘€濇垨鈥滆秴鍑轰竴鑸檺搴︹€濈殑鎰忔€濄€傚湪JavaScript涓紝鎴戜滑鍙互灏嗗厓缂栫▼鐨勫姛鑳藉垎涓哄嚑绫伙細绗竴绫绘槸鏌ユ壘鍜屾坊鍔犲璞″睘鎬х浉鍏崇殑鍔熻兘锛涚浜岀被鏄垱寤虹壒瀹氶鍩熺殑璇█锛屼緥濡侱SL锛涚涓夌被鏄綔涓哄璞¤楗板櫒鐨勪唬鐞嗐€備粖澶╋紝璁╂垜浠竴涓€浜嗚В銆侾ropertiesofobjectproperties涓€銆佸璞″睘鎬х殑璁剧疆鎴戜滑閮界煡閬揓avascript瀵硅薄鐨勫睘鎬у寘鍚悕绉板拰鍊笺€備絾闄ゆ涔嬪锛屾垜浠渶瑕佷簡瑙g殑鏄紝姣忎釜灞炴€ф湰韬兘鏈変笁涓浉鍏崇殑灞炴€э紝鍒嗗埆鏄彲鍐欍€佸彲鏋氫妇鍜屽彲閰嶇疆銆傝繖涓変釜灞炴€ф寚瀹氬睘鎬х殑琛屼负鏂瑰紡锛屼互鍙婃垜浠彲浠ョ敤瀹冧滑鍋氫粈涔堛€傝繖閲岀殑鍙啓灞炴€ф寚瀹氬睘鎬х殑鍊兼槸鍚﹀彲浠ユ敼鍙橈紱鍙灇涓惧睘鎬ф寚瀹氳灞炴€ф槸鍚﹀彲浠ヨfor/in寰幆鍜孫bject.keys()鏂规硶鏋氫妇锛涘彲閰嶇疆灞炴€ф寚瀹氳灞炴€ф槸鍚﹀彲浠ヨ鍒犻櫎鎴栨洿鏀瑰睘鎬с€傞偅涔堟煡璇㈠拰璁剧疆灞炴€ф湁浠€涔堢敤鍛紵杩欏浜庡緢澶氱涓夋柟搴撶殑寮€鍙戣€呮潵璇存槸闈炲父閲嶈鐨勶紝鍥犱负瀹冨厑璁稿紑鍙戣€呯粰鍘熷瀷瀵硅薄娣诲姞鏂规硶锛屼篃鍙互鍍忔爣鍑嗗簱涓殑寰堝鍐呯疆鏂规硶涓€鏍峰皢瀹冧滑璁剧疆涓轰笉鍙灇涓撅紱鍚屾椂锛岃繖涔熷厑璁稿紑鍙戜汉鍛樷€滈攣瀹氣€濆璞★紝浣垮睘鎬у畾涔夋棤娉曟洿鏀规垨鍒犻櫎銆傛垜浠彲浠ユ妸灞炴€у垎涓轰袱绫伙紝涓€绫绘槸鈥滄暟鎹睘鎬р€濓紝涓€绫绘槸鈥滆闂€呭睘鎬р€濄€傚鏋滄垜浠妸value銆乬etter銆乻etter鐪嬫垚鍊硷紝閭d箞鏁版嵁灞炴€у寘鎷洓涓睘鎬э細value銆亀ritable銆乪numerable銆乧onfigurable锛涜€岃闂櫒灞炴€у寘鎷琯et銆乻et鍜宔numerable杩?涓睘鎬ц鍒楀嚭鏉ュ苟涓旀槸鍙厤缃殑銆倃ritable銆乪numerable鍜宑onfigurable灞炴€ф槸甯冨皵鍊硷紝get鍜宻et灞炴€ф槸鍑芥暟鍊笺€俹bject.getOwnPropertyDescriptor()锛氳幏鍙栧璞″睘鎬х殑灞炴€ф弿杩般€傞【鍚嶆€濅箟锛岃鏂规硶鍙€傜敤浜庤幏鍙栧璞℃湰韬殑灞炴€с€侰hainObject.defineProperty()锛氬鏋滆璁剧疆灞炴€х殑灞炴€ф垨鍒涘缓鍏锋湁鎸囧畾灞炴€х殑鏂板睘鎬ф椂浣跨敤銆?.瀵硅薄鐨勬墿灞曟€ч櫎浜嗚幏鍙栧拰璁剧疆瀵硅薄鐨勫睘鎬у锛屾垜浠繕鍙互璁剧疆瀵硅薄鏈韩鐨勬墿灞曟€с€傛垜浠彲浠ラ€氳繃Object.isExtensible()浣垮璞″彲鎵╁睍锛屽悓鏍凤紝鎴戜滑涔熷彲浠ラ€氳繃Object.preventExtensions()灏嗗璞¤缃负涓嶅彲鎵╁睍銆備絾鏄繖閲岄渶瑕佹敞鎰忕殑鏄紝涓€鏃︽垜浠皢涓€涓璞¤缃负涓嶅彲鎵╁睍鐨勶紝鎴戜滑涓嶄粎涓嶈兘鍦ㄨ瀵硅薄涓婅缃睘鎬э紝鑰屼笖鎴戜滑涔熶笉鑳藉皢璇ュ璞℃敼鍥炲彲鎵╁睍鐨勩€傚彟澶栵紝杩欑涓嶅彲鎵╁睍鎬у彧褰卞搷瀵硅薄鏈韩鐨勫睘鎬э紝涓嶅彈瀵硅薄鍘熷瀷瀵硅薄涓婄殑灞炴€у奖鍝嶃€傚璞″欢灞曟€ч€氬父鐢ㄤ簬瀵硅薄鐘舵€佺殑閿佸畾銆傞€氬父鎴戜滑鍦ㄥ睘鎬ц缃腑缁撳悎writable鍜宑onfigurable灞炴€ф潵浣跨敤銆傚湪JavaScript涓紝鎴戜滑鍙互閫氳繃Object.seal();缁勫悎涓嶅彲鎵╁睍鍜屼笉鍙厤缃殑灞炴€э紱閫氳繃Object.freeze()鎴戜滑鍙互缁勫悎涓嶅彲鎵╁睍銆佷笉鍙厤缃拰涓嶅彲鍐欑殑灞炴€с€?.瀵硅薄鐨勫師鍨嬪璞″墠闈㈡垜浠粙缁嶇殑Object.freeze()鍜孫bject.seal()閮芥槸涓€鏍风殑灞炴€ц缃柟娉曪紝瀹冧滑鍙綔鐢ㄤ簬瀵硅薄鏈韩锛屼笉浼氬奖鍝嶅璞$殑鍘熷瀷鐩殑銆俷ew鍒涘缓鐨勫璞′細浣跨敤鍒涘缓鍑芥暟鐨勫師鍨嬪€间綔涓鸿嚜宸辩殑鍘熷瀷锛孫bject.create()鍒涘缓鐨勫璞′細浣跨敤绗竴涓弬鏁颁綔涓哄璞$殑鍘熷瀷銆侽bject.getPrototypeOf()鑾峰彇瀵硅薄鐨勫師鍨嬶紱閫氳繃isPrototypeOf()鎴戜滑鍙互鍒ゆ柇涓€涓璞℃槸鍚︽槸鍙︿竴涓璞$殑鍘熷瀷锛涢€氳繃Object.setPrototypeOf()淇敼瀵硅薄鐨勫師鍨嬶紱浣嗛渶瑕佹敞鎰忕殑涓€鐐规槸锛岄€氬父涓€鏃﹀師鍨嬭璁剧疆锛屽畠灏卞緢灏戣鏇存敼锛屽苟涓斾娇鐢∣bject.setPrototypeOf()鍙兘浼氬鎬ц兘浜х敓褰卞搷銆侱SL鐨勬ā鏉挎爣绛炬垜浠煡閬擄紝鍦↗avaScript涓紝鍙嶅紩鍙峰唴鐨勫瓧绗︿覆绉颁负妯℃澘鏂囧瓧銆傚綋涓€涓€间负鍑芥暟鐨勮〃杈惧紡鍚庨潰璺熺潃涓€涓ā鏉垮瓧闈㈤噺鏃讹紝瀹冨氨鍙樻垚浜嗕竴涓嚱鏁拌皟鐢紝鎴戜滑绉颁箣涓衡€滃甫鏍囩鐨勬ā鏉垮瓧闈㈤噺鈥濄€備负浠€涔堟垜浠涓烘爣璁版ā鏉垮瓧闈㈤噺瀹氫箟涓€涓柊鐨勬爣璁板嚱鏁板彲浠ヨ璁や负鏄竴绉嶅厓缂栫▼鍛紵鐢变簬鏍囪妯℃澘閫氬父鐢ㄤ簬瀹氫箟DSL鎴栭鍩熺壒瀹氳瑷€锛屽洜姝ゅ畾涔夋柊鐨勬爣璁板嚱鏁板氨鍍忓悜JavaScript娣诲姞鏂拌娉曚竴鏍枫€傛爣绛炬ā鏉挎枃瀛楀凡琚澶氬墠绔疛avaScript搴撻噰鐢ㄣ€侴raphQL鏌ヨ璇█鍙互閫氳繃浣跨敤gql``鏍囪鍔熻兘灏嗘煡璇㈠祵鍏ュ埌JavaScript浠g爜涓€侲motion搴撲娇鐢ㄤ簡css``鏍囩鍔熻兘锛屼娇寰桟SS鏍峰紡涔熷彲浠ュ祵鍏ュ埌JavaScript涓€傚綋鍑芥暟琛ㄨ揪寮忓悗璺熸ā鏉挎枃瀛楁椂锛屽皢璋冪敤璇ュ嚱鏁般€傚綋鎴戜滑鎯冲畨鍏ㄥ湴灏嗗€兼彃鍏TML瀛楃涓叉椂锛屾ā鏉垮緢鏈夌敤銆傝鎴戜滑浠tml``涓轰緥锛屾爣绛惧湪浣跨敤瀹冩瀯寤烘渶缁堝瓧绗︿覆涔嬪墠瀵规瘡涓€兼墽琛孒TML杞箟銆俧unctionhtml(str,...val){varescaped=val.map(v=>String(v).replace("&","&").replace("'","'"));鍙樼缁撴灉=娴峰场[0];for(vari=0;ix${operator}y`//=>"x&y"鎺ヤ笅鏉ユ垜浠湅涓€涓嬪湪鍙嶅皠瀵硅薄銆俁eflect涓嶆槸涓€涓被锛岀被浼间簬Math瀵硅薄锛屽畠鐨勫睘鎬у彧鏄畾涔変簡涓€缁勭浉鍏崇殑鍑芥暟銆侲S6涓坊鍔犵殑鍑芥暟閮藉湪鍛藉悕绌洪棿涓紝瀹冧滑妯′豢鏍稿績璇█鐨勮涓猴紝骞朵笖澶嶅埗瀵硅薄鍑芥暟鐨勫悇绉嶉鍏堝瓨鍦ㄧ殑鐗规€с€傚敖绠eflect鍑芥暟涓嶆彁渚涗换浣曟柊鍔熻兘锛屼絾涓轰簡鏂逛究璧疯锛屽畠浠‘瀹炲皢杩欎簺鍔熻兘缁勫悎鍦ㄤ竴涓狝PI涓€傛瘮濡傛垜浠笂闈㈡彁鍒扮殑瀵硅薄灞炴€х殑璁剧疆銆佹墿灞曟€с€佸璞″師鍨嬪璞″湪Reflect涓兘鏈夌浉搴旂殑鏂规硶锛屾瘮濡俁eflect.set()銆丷eflect.isExtensible()鍜孯eflect.getPrototypeOf()绛夈€傛帴涓嬫潵鎴戜滑浼氱湅鍒癛eflect鍑芥暟鐨勯泦鍚堝拰Proxy鐨刪andler鏂规硶闆嗗悎涔熷彲浠ヤ竴涓€瀵瑰簲銆侾roxy鍜孯eflect鍦‥S6鍙婃洿楂樼増鏈腑鎻愪緵鐨凱roxy绫诲彲浠ヨ鏄疛avaScript涓渶寮哄ぇ鐨勫厓缂栫▼鍔熻兘銆傚畠鍏佽鎴戜滑缂栧啓浠g爜鏉ユ敼鍙楯avaScript瀵硅薄鐨勫熀鏈涓恒€傛垜浠墠闈㈡彁鍒扮殑ReflectAPI鏄竴缁勫嚱鏁帮紝鍙互璁╂垜浠洿鎺ヨ闂JavaScript瀵硅薄鐨勪竴缁勫熀鏈搷浣溿€傚綋鎴戜滑鍒涘缓Proxy瀵硅薄鏃讹紝鎴戜滑鎸囧畾浜嗗彟澶栦袱涓璞★紝鐩爣瀵硅薄鍜屽鐞嗙▼搴忓璞°€倂artarget={message1:"hello",message2:"world",};鍙橀噺澶勭悊绋嬪簭={};varproxy=newProxy(target,handler);鐢熸垚鐨勪唬鐞嗗璞℃病鏈夎嚜宸辩殑鐘舵€佹垨琛屼负銆傛瘡褰撳鍏舵墽琛屾搷浣滐紙璇诲彇灞炴€с€佸啓鍏ュ睘鎬с€佸畾涔夋柊灞炴€с€佹煡鎵惧師鍨嬨€佸皢鍏朵綔涓哄嚱鏁拌皟鐢級鏃讹紝瀹冮兘浼氬皢杩欎簺鎿嶄綔鍒嗘淳缁欏鐞嗙▼搴忓璞℃垨鐩爣瀵硅薄銆備唬鐞嗗璞℃敮鎸佷笌ReflectAPI瀹氫箟鐨勭浉鍚岀殑鎿嶄綔銆侾roxy鐨勫伐浣滄満鍒舵槸濡傛灉handler涓虹┖锛屼唬鐞嗗璞″彧鏄竴涓€忔槑鐨勮楗板櫒銆傛墍浠ュ湪涓婇潰鐨勪緥瀛愪腑锛屽鏋滄垜浠墽琛屼唬鐞嗭紝瀹冭繑鍥炵殑缁撴灉灏辨槸鐩爣瀵硅薄涓婄殑鍘熷灞炴€с€傛帶鍒跺彴鏃ュ織锛坧roxy.message1锛夛紱//helloconsole.log(proxy.message2);//world閫氬父锛屾垜浠粨鍚堜娇鐢≒roxy鍜孯eflect銆傝繖鏍峰仛鐨勫ソ澶勬槸瀵逛簬鎴戜滑涓嶆兂鑷畾涔夌殑閮ㄥ垎锛屾垜浠彲浠ヤ娇鐢≧eflect鏉ヨ皟鐢ㄥ璞$殑鍐呯疆鏂规硶銆俢onsttarget={message1:"hello",message2:"world",};consthandler={get(target,prop,receiver){if(prop==="message2"){杩斿洖"Jackson";}returnReflect.get(...arguments);},};varproxy=newProxy(target,handler);console.log(proxy.message1);//helloconsole.log(proxy.message2);//Jackson杩欑瘒鏂囩珷鏄簩鏈圖ay22瀛︿範绗旇锛屼簩鏈堢殑鏈€鍚庝竴澶╋紝鍐呭鏉ヨ嚜鏋佸鏃堕棿銆奐vascript杩涢樁瀹炴垬璇俱€嬶紝涓€璧疯繘姝ヰ煉煉?/p>