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

JavaScript原型,原型链

时间:2023-03-26 23:38:29 JavaScript

鍓嶈█Java绛夊叾浠栫紪绋嬭瑷€鍦ㄤ娇鐢╪ew鍛戒护鏃讹紝浼氳皟鐢ㄢ€滅被鈥濈殑鏋勯€犲嚱鏁般€備絾鏄紝JavaScript娌℃湁鈥滅被鈥濓紝鏈韩涓嶆彁渚涚被鐨勫疄鐜帮紙铏界劧ES6涓彁渚涗簡class鍏抽敭瀛楋紝浣嗗畠鍙槸璇硶绯栵紝JavaScript浠嶇劧鏄熀浜庡師鍨嬬殑锛夈€傚洜姝わ紝JavaScript鍋氫簡涓€涓畝鍖栫殑鎯虫硶銆俷ew鍛戒护鍚庤窡鐨勪笉鏄竴涓被锛岃€屾槸涓€涓瀯閫犲嚱鏁般€傛瀯閫犲嚱鏁扮敤浜庣敓鎴愬疄渚嬪璞★紝浣嗗畠鐨勭己鐐规槸涓嶈兘鍏变韩灞炴€у拰鏂规硶銆傚洜姝わ紝涓烘瀯閫犲嚱鏁拌缃簡涓€涓師鍨嬪睘鎬э紝鍏朵腑鍖呭惈涓€涓璞★紙prototypeobject锛夈€傛墍鏈夊疄渚嬪璞¢渶瑕佸叡浜殑灞炴€у拰鏂规硶鏀惧湪杩欎釜瀵硅薄涓紝閭d簺涓嶉渶瑕佸叡浜殑灞炴€у拰鏂规硶鏀惧湪鏋勯€犲嚱鏁颁腑銆傪煉℃俯棣ㄦ彁绀猴細鏈枃鍏ㄦ枃1986瀛楋紝鎺ㄨ崘闃呰鏃堕暱10m锛屽共鏉紒1.鏄惧紡鍘熷瀷锛坧rototype锛?.1浠嬬粛姣忎釜鍑芥暟鍒涘缓鍚庯紝閮戒細鏈変竴涓悕涓簆rototype鐨勫睘鎬э細functionParent(){}Parent.prototype.name='kite';letchild=newParent();console.鏃ュ織锛堝瀛愮殑鍚嶅瓧锛夛紱璇ュ睘鎬ф寚鍚戝嚱鏁扮殑鍘熷瀷瀵硅薄锛團unction.prototype.bind鏂规硶鏋勯€犵殑鍑芥暟鏄釜渚嬪锛屽畠娌℃湁prototype灞炴€э級锛屽嵆璋冪敤鏋勯€犲嚱鏁板垱寤虹殑瀹炰緥鐨勫師鍨嬶紝鍗冲氨鏄紝绀轰緥鍘熷瀷涓殑瀛╁瓙銆備粈涔堟槸鍘熷瀷锛氭瘡涓狫avaScript瀵硅薄锛坣ull闄ゅ锛夐兘涓庡彟涓€涓璞$浉鍏宠仈銆傝繖涓璞″氨鏄師鍨嬨€備笂闈篃鎻愬埌浜嗘瘡涓璞¢兘浼氫粠鍘熷瀷鈥滅户鎵垮睘鎬р€濄€傚師鍨嬫樉绀轰簡鏋勯€犲嚱鏁板拰瀹炰緥鍘熷瀷涔嬮棿鐨勫叧绯汇€?.2瑙掕壊鏄惧紡鍘熷瀷鐢ㄤ簬瀹炵幇鍩轰簬鍘熷瀷鐨勭户鎵垮拰灞炴€у叡浜€?.闅愬紡鍘熷瀷锛坃_proto__锛?.1浠嬬粛JS涓殑浠讳綍瀵硅薄閮芥湁涓€涓唴缃睘鎬[prototype]]锛屽湪ES5涔嬪墠娌℃湁鏍囧噯鐨勬柟寮忔潵璁块棶瀹冿紝澶у鏁版祻瑙堝櫒閫氳繃__proto__鏉ヨ闂畠銆侲S5瀵硅繖涓唴缃睘鎬ф湁涓€涓爣鍑嗙殑get鏂规硶锛歄bject.getPrototypeOf锛圤bject.prototype鏄釜渚嬪锛屽畠鐨刜_proto__涓簄ull锛夈€俧unctionParent(){}letchild=newParent();console.log(child.__proto__===Parent.prototype);//true2.2浣滀负闅愬紡鍘熷瀷锛屽舰鎴愬師鍨嬮摼锛屼篃鐢ㄤ簬瀹炵幇鍩轰簬鍘熷瀷鐨勭户鎵裤€備緥濡傦細褰撴垜浠闂竴涓璞′腑鐨勬煇涓睘鎬ф椂锛屽鏋滃湪瀵硅薄涓壘涓嶅埌锛屾垜浠氨浼氫竴鐩存部鐫€__proto__锛堝師鍨嬬殑prototype锛夋煡鎵撅紝鐩村埌鎵惧埌鏈€椤跺眰銆俧unctionParent(){}Parent.prototype.name='dave';letchild=newParent();child.name='kite';console.log(child.name);//'kite'deletechild.name;console.log(child.name);//鍦ㄤ笂闈㈢殑'dave'绀轰緥涓紝name灞炴€ц娣诲姞鍒板璞hild銆傚湪璁块棶name灞炴€ф椂锛屼細鎵惧埌瀵硅薄鏈韩鐨勫睘鎬у€糼ite銆傚垹闄ame灞炴€у悗锛屽啀娆¤闂畁ame灞炴€э紝鍦ㄥ璞′腑鎵句笉鍒拌灞炴€э紝鍐嶅湪prototype涓悳绱㈡壘鍒癲ave銆傚鏋滃湪鍘熷瀷涓病鏈夋壘鍒拌灞炴€э紝灏变細鍘诲師鍨嬬殑鍘熷瀷涓鎵俱€傛垜浠煡閬撳師鍨嬫槸涓€涓璞°€傛棦鐒舵槸瀵硅薄锛岄偅涔堝彲浠ョ敤鏈€鍘熷鐨勬柟寮忓垱寤猴細letobj=newObject();鍘熷瀷鏄€氳繃浠嶰bject鏋勯€犱竴涓璞¤€岀敓鎴愮殑銆侽bject.prototype鐨勫師鍨嬫槸浠€涔堬紵瀵硅薄.prototype.__proto__=null;//truenull琛ㄧず娌℃湁瀵硅薄锛岃鏄庤繖閲屽彲浠ュ仠姝㈡煡鎵俱€?.3鎸囧悜__proto__鎸囧悜鍒涘缓杩欎釜瀵硅薄鐨勫嚱鏁扮殑鏄惧紡鍘熷瀷锛屽叧閿槸鎵惧埌鍒涘缓杩欎釜瀵硅薄鐨勬瀯閫犲嚱鏁般€傚璞″垱寤烘湁涓夌褰㈠紡锛氬璞″瓧闈㈤噺锛涙柊鐨勶紙绫伙級锛汦S5鐨凮bject.create()銆傛湰璐ㄤ笂鍙湁涓€绉嶆柊銆?.3.1瀵硅薄瀛楅潰閲弆etobj={name:'ctt'}瀵硅薄瀛楅潰閲忓0鏄庣殑瀵硅薄缁ф壙鑷狾bject銆傚拰newObject涓€鏍凤紝瀹冪殑鍘熷瀷鏄疧bject.prototype銆傚苟涓擮bject.prototype涓嶇户鎵夸换浣曞睘鎬у拰鏂规硶銆?.3.2new浣跨敤鏋勯€犲嚱鏁板垱寤虹殑瀵硅薄锛屽叾灞炴€х户鎵胯嚜鏋勯€犲嚱鏁般€傚叿浣撳彲浠ュ垎涓轰互涓嬪嚑绉嶆儏鍐碉細Array()绛夊唴缃璞★紝缁ф壙鑷狝rray.prototype锛孉rray.prototype鏄竴涓璞★紝杩欎釜瀵硅薄鏄敱Object()鏋勯€犲嚱鏁板垱寤虹殑銆傚洜姝わ紝Array.prototype.__proto__===Object.prototype锛屽師鍨嬮摼涓猴細Array.prototype->Object.prototype->null銆傞粯璁よ嚜瀹氫箟瀵硅薄锛歠unctionFoo(){};璁ゝoo=newFoo();Foo.prototype.__proto__===Object.prototype;鍏朵粬鎯呭喌锛?/甯屾湜Foo缁ф壙鑷狟arfunctionBar(){}Foo.prototype=newBar();Foo.prototype.__prototype__=Bar.prototype;//閲嶆柊瀹氫箟Foo.prototypeFoo.prototype={a:1,b:2};Foo.prototype.__proto__=Object.prototype;涓婇潰涓ょ鎯呭喌涓嬶紝Foo.prototype琚噸鍐欎簡锛屾墍浠oo.prototype.constructor涔熼殢涔嬫敼鍙橈紝鏋勯€犲嚱鏁颁笌鍘熸潵鐨勬瀯閫犲嚱鏁癋oo鎴柇浜嗐€傛瀯閫犲嚱鏁版瀯閫犲嚱鏁版槸Function()鐨勫疄渚嬶紝鍥犳鏋勯€犲嚱鏁扮殑闅愬紡鍘熷瀷鎸囧悜Function.prototype銆傚紩鎿庡垱寤篛bject.prototype锛岀劧鍚庡垱寤篎unction.prototype锛屽苟閫氳繃__proto__杩炴帴涓よ€呫€侳unction.prototype===Function.__proto__锛屾墍鏈夊叾浠栫殑鏋勯€犲嚱鏁伴兘鍙互閫氳繃鍘熷瀷閾炬壘鍒癋unction.prototype锛岃€屽嚱鏁癋unction()鏈川涓婁篃鏄竴涓嚱鏁帮紝涓轰簡涓嶅紩璧锋贩娣嗭紝鍑芥暟Function鐨刜_proto__琚摼鎺ュ埌鍔熻兘銆傚湪鍘熷瀷涓娿€?.3.3class鍦‥S5涓紝姣忎釜瀵硅薄閮芥湁涓€涓猒_proto__灞炴€э紝鎸囧悜瀵瑰簲鏋勯€犲嚱鏁扮殑prototype灞炴€э紝鑰宑lass浣滀负鏋勯€犲嚱鏁扮殑璇硶绯栵紝鏃㈡湁prototype灞炴€у張鏈塤_proto__灞炴€э紝鎵€浠ユ湁涓や釜缁ф壙鍦ㄥ悓涓€鏃堕棿閾俱€傚瓙绫荤殑__proto__琛ㄧず鏋勯€犲嚱鏁扮殑缁ф壙锛屽缁堟寚鍚戠埗绫伙紱瀛愮被鐨刾rototype灞炴€х殑__proto__琛ㄧず鏂规硶鐨勭户鎵匡紝濮嬬粓鎸囧悜鐖剁被鐨勫師鍨嬨€傜埗绫粄}瀛愮被鎵╁睍鐖剁被{}Child.__proto__===Parent;Child.prototype.__proto__===Parent.prototype;浣滀负瀵硅薄锛屽瓙绫籆hild鐨勫師鍨嬶紙__proto__锛夋槸鐖剁被Parent锛涗綔涓轰竴涓瀯閫犲嚱鏁帮紝瀛愮被鐨勫師鍨嬪璞★紙prototype锛夋槸鐖剁被鐨勫師鍨嬪璞★紙prototype锛夌殑涓€涓疄渚嬨€?.3.4Object.create()Object.create()鏄竴涓狤S5鏂规硶锛屽彲浠ヨ皟鐢ㄥ畠鏉ュ垱寤轰竴涓柊鐨勫璞°€傛柊瀵硅薄鐨勫師鍨嬫槸浼犲叆鐨勭涓€涓弬鏁般€?.鏋勯€犲櫒锛坈onstructor锛変笂闈㈣鏄庢瀯閫犲櫒鍜屽疄渚嬮兘鍙互鎸囧悜鍘熷瀷銆備笅涓€涓睘鎬ф槸璁╁師鍨嬫寚鍚戞瀯閫犲嚱鏁帮紙杩欓噷娌℃湁鎸囧悜瀹炰緥鐨勫睘鎬э紝鍥犱负鏋勯€犲嚱鏁板彲浠ョ敓鎴愬涓疄渚嬶級锛屽氨鏄痗onstructor灞炴€э紝姣忎釜鍘熷瀷閮芥湁涓€涓猚onstructor灞炴€ф寚鍚戞瀯閫犲嚱鏁般€傚嚱鏁癙arent(){}console.log(Parent===Parent.prototype.constructor);鍘熷瀷鐨勫悇绉嶅叧绯绘€荤粨濡傚浘锛?.this鍜屽師鍨嬪畾涔夋柟娉曠殑鍖哄埆this瀹炵幇鐨勬柟娉曞彲浠ュ湪绫荤鏈夊彉閲忓拰绉佹湁鏂规硶涓闂€備絾鏄紝鍘熷瀷瀵硅薄瀹炵幇鐨勬柟娉曚笉鑳借闂被涓殑绉佹湁鍙橀噺鍜屾柟娉曘€傚綋瀹炰緥璁块棶瀵硅薄鐨勫睘鎬ф垨鏂规硶鏃讹紝浼氶伒寰師鍨嬮摼鍘熷瀷閾剧殑鏌ユ壘瑙勫垯銆傚厛鎵捐嚜宸辩殑闈欐€佸睘鎬у拰鏂规硶锛屽啀鎵炬瀯閫犱笂涓嬫枃鍙闂殑灞炴€у拰鏂规硶锛屾渶鍚庢壘鏋勯€犵殑鍘熷瀷閾俱€傝繖涓拰鍘熷瀷瀹氫箟鐨勫彟涓€涓尯鍒槸瀹冧滑鍦ㄥ唴瀛樹腑鍗犳嵁涓嶅悓鐨勭┖闂淬€備娇鐢ㄢ€渢his鈥濆叧閿瓧锛屽湪鍒濆鍖栧疄渚嬫椂锛屼负姣忎釜瀹炰緥鎵撳紑鎵€鏈夌殑灞炴€с€佹柟娉曞拰鏋勯€犳柟娉曚腑鍖呭惈鐨勬墍闇€绌洪棿锛屽苟瀹氫箟鍘熷瀷锛屽洜涓哄師鍨嬪疄闄呬笂鏄鐖剁被鐨勫紩鐢紝鎵€浠ュ畠鍦ㄥ垵濮嬪寲鏃朵娇鐢紝姣斿瓨鍌ㄤ腑鐨勨€渢his鈥濇洿鑺傜渷璧勬簮銆?.鎬荤粨姣忎釜鍑芥暟鍒涘缓鍚庯紝閮戒細鏈変竴涓悕涓簆rototype鐨勫睘鎬с€傝灞炴€ф寚鍚戝嚱鏁扮殑鍘熷瀷瀵硅薄锛堟樉寮忓師鍨嬶級銆傛墍鏈夐渶瑕佽瀹炰緥瀵硅薄鍏变韩鐨勫睘鎬у拰鏂规硶閮芥斁鍦ㄨ繖涓璞′腑锛涗换浣曞璞¢兘鏈変竴涓唴缃睘鎬_proto__鎸囧悜鍒涘缓璇ュ璞$殑鍑芥暟鐨勬樉寮忓師鍨嬶紱class鏄瀯閫犲嚱鏁扮殑璇硶绯栵紝鍚屾椂鍏锋湁prototype灞炴€у拰__proto__灞炴€с€備綔涓轰竴涓璞★紝瀛愮被Child鐨勫師鍨嬶紙__proto__锛夊氨鏄埗绫籔arent锛涗綔涓烘瀯閫犲嚱鏁帮紝瀛愮被鐨勫師鍨嬪璞★紙prototype锛夋槸鐖剁被鍘熷瀷瀵硅薄锛坧rototype锛夌殑瀹炰緥銆傛瘡涓師鍨嬮兘鏈変竴涓寚鍚戞瀯閫犲櫒鐨刢onstructor灞炴€э紝鍗砅arent===Parent.prototype.constructorReferenceJavaScript-Prototype,PrototypeChain路Issue#13路cttin/cttin.github.io路GitHub