js原型链和继承的理解

Object() Function() Array() 等等都为构造函数。
Js 面向对象与传统oop 有些不同,语法较高级 语法糖封装。
This 为指针。指向this作用域的调用者

1.原型继承链顶端为Object 。Js函数是对象

2.当读取对象中的属性时,先去实例本身中搜索,如搜索不到则去指向的原型中搜索

1.原型的存在意义在于实现继承共享,是在构造函数中定义的一个成员对象,在下次实例化时不需要在构造函数中定义成员 就可实现实例共享方法属性。
例子:通常为。 构造函数.prototype.xxx=我想实现实例继承的东西 -》 new 构造函数 -》新实例a对象.原型指针指向构造函数的xxx对象(引用类型)

例子:Array 不等于 Array() 原因 Array为一个函数,而Array()为一个构造函数调用语句,故Array拥有prototype对象用于实例的共享继承,Array()产生一个实例 故只能拥有prototype对象的私有指针 proto

2.在使用原型继承时 不能使用字面量 构造函数.prototype={} 的方式重写原型对象 。因为会导致该原型对象的constructor属性被重写,在生成的实例中导致constructor指向Object并且会切断之前原型对象的联系,破坏原型链。

3.JavaScript 主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的

例子:
xxx实例. proto -》function xxx()构造函数.prototype对象故xxx. proto === xxx.prototype

xxx.prototype. proto -》Object.prototype因为所有对象都为Object函数构造来的。故xxx.prototype. proto ===Object.prototype。

Object.prototype. proto 为原型链顶端 proto 定义了尚未使用所以为null故Object.prototype. proto ===null约定俗成。

instanceof 用来判断某实例是否为某构造函数的实例
isPrototypeOf 用于判断某实例是否拥有某构造函数的原型对象指针

1.原型模式有忽略构造函数定义初始值步骤及原型中操作引用类型的缺点。
所以需要组合使用 构造函数模式+原型模式 来创建实例。在构造函数中定义实例的属性,而需共享的方法就定义在原型对象中。
继承:在子构造函数中调用 父.call(this, name); 实现构造函数之间的属性继承。使用 子.prototype = new 父(); 子.prototype.constructor = 子;实现方法的继承。

2.如要在生产环境下的构造函数新增方法(如Array) 需要使用一个类似于工厂函数的寄生构造函数模式 在构造函数中返回一个修改后的对象



  • js涓浠涔堟槸鍘熷瀷瀵硅薄鍜鍘熷瀷閾
    绛旓細log(o.name);// 杈撳嚭锛 undefinedF.prototype.name = "foo";console.log(o.name);// 杈撳嚭锛 foo// 涓婇潰杩欎釜渚嬪瓙鏄兂璇存槑锛氶氳繃 new 鍦ㄥ璞 o 涓庡璞 F.prototype 涔嬮棿寤虹珛浜嗚仈绯伙紝 杩欎釜寤虹珛鑱旂郴// 鐨勬柟寮忔湁浜哄彨 "鍘熷瀷缁ф壙" 銆 褰撹闂殑瀵硅薄灞炴т笉瀛樺湪鏃讹紝灏变細娌跨潃鍘熷瀷閾鍘绘煡鎵俱
  • 鍘熷瀷閾剧殑鐞嗚В鏄粈涔?
    绛旓細js瀵硅薄鏄敱鏋勯犳柟娉曞垱寤虹殑锛屾瀯閫犳柟娉曟湁涓師鍨媝rototype锛岄偅涔堝璞″拰鍘熷瀷涔嬮棿鐨勫叧绯诲氨鍙仛鍘熷瀷閾銆備緥濡傦細鐢ㄥ師鍨嬬粰瀵硅薄瀹氫箟鏂规硶obj銆俻rototype銆俧unName = function锛堬級{alert锛涘璞″彲浠ョ洿鎺ヤ粠鍘熷瀷涓皟鐢ㄨ繖涓柟娉昽bj銆俧unName锛堬級锛涙洿澶JS娣卞眰鐭ヨ瘑鍙互杩涚兢鍓嶉潰鏄簩涔6涓棿鏄5涔濅竴鍚庨潰鏄簩涔濋浂锛屾瘡澶╁垎浜獼S娣卞眰鎶鏈
  • js闈㈠悜瀵硅薄
    绛旓細閫氳繃鍘熷瀷閾鍙互瀹炵幇缁ф壙锛岃涓涓璞$户鎵垮彟涓涓璞$殑灞炴у拰鏂规硶銆傜被涓庣被缁ф壙 铏界劧JavaScript鏈鍒濇槸鍩轰簬鍘熷瀷鐨勮瑷锛屼絾ES6寮曞叆浜嗙被璇硶锛岃繖浣垮緱闈㈠悜瀵硅薄缂栫▼鏇村姞鐩磋鍜屾槗浜鐞嗚В銆備娇鐢╟lass鍏抽敭瀛楀彲浠ュ畾涔夌被锛屽苟鍙互鍦ㄧ被涓畾涔夊睘鎬у拰鏂规硶銆傜被涔嬮棿鍙互鐩镐簰缁ф壙锛屽瓙绫诲彲浠ョ户鎵跨埗绫荤殑灞炴у拰鏂规硶锛屽苟鍙互娣诲姞鏂扮殑...
  • 鍘熷瀷閾浠嬬粛
    绛旓細瀵硅薄璁块棶鍘熷瀷閾句腑鐨勬垚鍛橀噰鐢ㄥ氨杩戝師鍒 1.濡傛灉鑷繁鏈韩鏈夊氨鍘昏嚜宸辩殑,濡傛灉鑷繁娌℃湁灏变粠鍘熷瀷涓壘,濡傛灉鍘熷瀷涓篃娌℃湁灏变粠鍘熷瀷鐨鍘熷瀷涓壘,涓娆$被鎺ㄧ煡閬撴壘鍒鍘熷瀷閾剧殑缁堢偣null,濡傛灉杩樻病鏈夋壘鍒版槸灞炴у氨杩斿洖undefined , 濡傛灉鏄柟娉曞氨杩斿洖xxx is not a function.js涓殑瀵硅薄閮芥槸鐢辨瀯閫犲嚱鏁板垱寤虹殑 1.鑷畾涔夋瀯...
  • JS绫荤殑鍒涘缓涓庣户鎵
    绛旓細JS涓锛岀被鐨勫垱寤烘柟寮忎笌鍑芥暟鐨勫垱寤烘柟寮忕浉鍚岋紝涓昏鍖哄埆鍦ㄤ簬涓鑸垜浠垱寤虹被鏃讹紝绫诲悕鐨勯瀛楁瘝闇瑕佸ぇ鍐欙紝鍚屾椂锛屾垜浠彲浠ュ啀绫荤殑鍘熷瀷涓婃坊鍔犲叕鍏卞睘鎬у拰鏂规硶銆傚垱寤轰緥瀛愬涓嬶細    JS绫荤殑缁ф壙涓昏鏈6绉嶆柟寮忥細鍘熷瀷閾剧户鎵銆佸疄渚嬬户鎵裤佺粍鍚堢户鎵裤佸師鍨嬪紡缁ф壙銆佸瘎鐢熺户鎵裤佸瘎鐢熺粍鍚堢户鎵     鍒涘缓绌...
  • 浠涔堟槸鍘熷瀷閾,瀹冧滑鐨勫尯鍒,鍦js涓瀹冧滑鍏蜂綋鎸囦粈涔
    绛旓細閭d箞浠涔堟槸鍘熷瀷閾鍛紵鍘熷瀷閾炬槸閽堝鏋勯犲嚱鏁扮殑锛屾瘮濡傛垜鍏堝垱寤轰簡涓涓嚱鏁帮紝鐒跺悗閫氳繃涓涓彉閲弉ew浜嗚繖涓嚱鏁帮紝閭d箞杩欎釜琚玭ew鍑烘潵鐨勫嚱鏁板氨浼缁ф壙鍒涘缓鍑烘潵鐨勯偅涓嚱鏁扮殑灞炴э紝鐒跺悗濡傛灉鎴戣闂畁ew鍑烘潵鐨勮繖涓嚱鏁扮殑鏌愪釜灞炴э紝浣嗘槸鎴戝苟娌℃湁鍦ㄨ繖涓猲ew鍑烘潵鐨勫嚱鏁颁腑瀹氫箟杩欎釜鍙橀噺锛岄偅涔堝畠灏变細寰涓婏紙鍚戝垱寤哄嚭瀹冪殑鍑芥暟涓級...
  • javascript 鏄浣曚綋鐜缁ф壙鐨
    绛旓細js鐢变簬鏄痯rototype鐨勫璞℃ā鍨嬶紝娌℃湁涓ユ牸鎰忎箟涓婄殑绫籧lass銆傚叏閮ㄩ兘鏄璞bject 瑕佸疄鐜缁ф壙锛屽彲浠ュ厛 //鍒涘缓涓涓埗瀵硅薄 OldObject=function(){ this.a="灞炴1"};//澶嶅埗鍑轰竴涓柊瀵硅薄锛屾柊瀵硅薄閲岄潰宸茬粡鍏锋湁鏃у璞$殑鍐呭 NewObject=new OldObject();//鏂板浜涘唴瀹癸紝鎵╁睍鏂板璞 NewObject.b="灞炴2";New...
  • js prototype鏄粈涔
    绛旓細prototype鏄竴涓睘鎬э紝鎵鏈夌殑鍑芥暟閮芥湁锛岃繖涓睘鎬у紩鐢ㄤ簡涓涓璞★紝鍗冲師鍨嬪璞★紝绠绉板師鍨嬨傛墍浠ュぇ澶氭暟鎶妏rototype涔嬮棿鍙師鍨嬨傞氳繃鍘熷瀷鍙互瀹炵幇鏂规硶鎴栬呭睘鎬ф墿鍏 姣斿 function A(){}A.prototype.show=function(){//鎵╁厖鍑芥暟A鐨勬柟娉晄how alert('1');}瀹炵幇鍘熷瀷閾鏂瑰紡鐨缁ф壙銆俧unction B(x,y){ this.y...
  • JS鍘熷瀷鍜屽師鍨嬮摼鏄浣曚娇鐢ㄧ殑?
    绛旓細JavaScript涓殑鍘熷瀷鍜屽師鍨嬮摼鏄潰鍚戝璞$紪绋嬩腑鐨勪竴涓噸瑕佹蹇点傛瘡涓嚱鏁伴兘鏈変竴涓猵rototype灞炴э紝杩欎釜灞炴ф槸涓涓寚閽堬紝鎸囧悜涓涓璞★紝鑰岃繖涓璞$殑鐢ㄩ旀槸鍖呭惈鍙互鐢辩壒瀹氱被鍨嬬殑鎵鏈夊疄渚嬪叡浜殑灞炴у拰鏂规硶銆傚綋鎴戜滑璇曞浘璁块棶涓涓璞$殑灞炴ф椂锛屽畠涓嶄粎浠呭湪璇ュ璞′笂鎼滃锛岃繕浼氭悳瀵昏瀵硅薄鐨勫師鍨嬶紝浠ュ強鍘熷瀷鐨鍘熷瀷锛屼緷娆...
  • js toString璇﹁В
    绛旓細瑕佹兂寮勬噦tostring锛屾垜浠鍏堣鐞嗚В鍘熷瀷鍜屽師鍨嬮摼銆備笂鍥句负鍘熷瀷閾剧殑绀烘剰鍥俱倀oString()** 鏂规硶杩斿洖涓涓〃绀鸿瀵硅薄鐨勫瓧绗︿覆銆 姣忎釜瀵硅薄閮芥湁涓涓 toString() 鏂规硶锛屽綋璇ュ璞¤琛ㄧず涓轰竴涓枃鏈兼椂锛屾垨鑰呬竴涓璞′互棰勬湡鐨勫瓧绗︿覆鏂瑰紡寮曠敤鏃惰嚜鍔ㄨ皟鐢ㄣ傞粯璁ゆ儏鍐典笅锛 toString() 鏂规硶琚瘡涓 Object ...
  • 扩展阅读:前端面试原型和原型链 ... 深入理解原型和原型链 ... js原型链的顶端是什么 ... 浅拷贝的三种实现方式js ... 对原型和原型链的理解 ... 原型原型链js通俗易懂 ... js原型链如何实现继承 ... js原型链面试题及答案 ... js中原型和原型链的理解 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网