日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

“约见”面试官系列之常见面试题第三十八篇之js常见的继承方式(建议收藏)

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “约见”面试官系列之常见面试题第三十八篇之js常见的继承方式(建议收藏) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.原型鏈繼承
核心: 將父類的實例作為子類的原型
將構造函數的原型設置為另一個構造函數的實例對象,這樣就可以繼承另一個原型對象的所有屬性和方法,可以繼續往上,最終形成原型鏈
父類

// 定義一個動物類 function Animal (name) {// 屬性this.name = name || 'Animal';// 實例方法this.sleep = function(){console.log(this.name + '正在睡覺!');} } // 原型方法 Animal.prototype.eat = function(food) {console.log(this.name + '正在吃:' + food); }; function Cat(){ } Cat.prototype = new Animal(); Cat.prototype.name = 'cat';// Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.eat('fish')); console.log(cat.sleep()); console.log(cat instanceof Animal); //true console.log(cat instanceof Cat); //true

問題
1.來自原型對象的所有屬性被所有實例共享
2.創建子類實例時,無法向父類構造函數傳參

2.構造函數繼承
使用父類的構造函數來增強子類實例,等于是復制父類的實例屬性給子類(沒用到原型)

function SuperType() {this.colors = ["red", "blue", "green"]; }function SubType() {//繼承SuperTypeSuperType.call(this); }var instance1 = new SubType(); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" var instance2 = new SubType(); alert(instance2.colors); //"red,blue,green"

特點:
解決了1中,子類實例共享父類引用屬性的問題
創建子類實例時,可以向父類傳遞參數
可以實現多繼承(call多個父類對象)
缺點:
實例并不是父類的實例,只是子類的實例
只能繼承父類的實例屬性和方法,不能繼承原型屬性/方法
無法實現函數復用,每個子類都有父類實例函數的副本,影響性能

3.組合繼承

將原型鏈和借用構造函數的技術組合到一塊。使用原型鏈實現對原型屬性和方法的繼承,而通過構造函數來實現對實例屬性的繼承。

function SuperType(name) {this.name = name;this.colors = ["red", "blue", "green"]; }SuperType.prototype.sayName = function() {alert(this.name); }function SubType(name, age) {// 繼承屬性SuperType.call(this, name);this.age = age; }// 繼承方法 SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function() {alert(this.age); };var instance1 = new SubType("Nicholas", 29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas"; instance1.sayAge(); //29 var instance2 = new SubType("Greg", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg"; instance2.sayAge(); //27

將SubType的原型指定為SuperType的一個實例,大致步驟和原型鏈繼承類似,只是多了在SubType中借調SuperType的過程。
實例屬性定義在構造函數中,而方法則定義在構造函數的新原型中,同時將新原型的constructor指向構造函數。
可以通過instanceof和isPrototypeOf()來識別基于組合繼承創建的對象。
避免了原型鏈和借用構造函數的缺陷,融合了它們的優點,成為JS中最常用的繼承模式。

4.原型式繼承
不自定義類型的情況下,臨時創建一個構造函數,借助已有的對象作為臨時構造函數的原型,然后在此基礎實例化對象,并返回。

function object(o){function F(){}F.prototype = o;return new F(); }

本質上是object()對傳入其中的對象執行了一次淺復制

var person = {name: "Nicholas",friends: ["Shelby", "Court", "Van"] };var anotherPerson = object(person); anotherPerson.name = "Greg"; anotherPerson.friends.push("Rob");var yetAnotherPerson = object(person); yetAnotherPerson.name = "Linda"; yetAnotherPerson.friends.push("Barbie");alert(person.friends); //"Shelby,Court,Van,Rob,Barbie"

原型的引用類型屬性會在各實例之間共享。
當只想單純地讓一個對象與另一個對象保持類似的情況下,原型式繼承是完全可以勝任的。

5.寄生組合式繼承
組合繼承是JS中最常用的繼承模式,但其實它也有不足,組合繼承無論什么情況下都會調用兩次超類型的構造函數,并且創建的每個實例中都要屏蔽超類型對象的所有實例屬性。
寄生組合式繼承就解決了上述問題,被認為是最理想的繼承范式。

function object(o) {function F(){}F.prototype = o;return new F(); }function inheritPrototype(superType, subType) {var prototype = object(superType.prototype);prototype.constructor = subType;subType.prototype = prototype; }function SuperType(name) {this.name = name;this.colors = ["red", "blue", "green"]; }SuperType.prototype.sayName = function() {alert(this.name); };function SubType(name, age) {SuperType.call(this, name);this.age = age; }inheritPrototype(SuperType, SubType); // 這一句,替代了組合繼承中的SubType.prototype = new SuperType()SubType.prototype.sayAge = function() {alert(this.age); };

不必為了指定子類型的原型而調用超類型的構造函數,我們需要的只不過是超類型原型的一個副本
在inheritPrototype()函數中所做的事:

1.在inheritPrototype函數中用到了原型式繼承中的object()方法,將超類型的原型指定為一個臨時的空構造函數的原型,并返回構造函數的實例。

2.此時由于構造函數內部為空(不像SuperType里面有實例屬性),所以返回的實例也不會自帶實例屬性,這很重要!因為后面用它作為SubType的原型時,就不會產生無用的原型屬性了,借調構造函數也就不用進行所謂的“重寫”了。

3.然后為這個對象重新指定constructor為SubType,并將其賦值給SubType的原型。這樣,就達到了將超類型構造函數的實例作為子類型原型的目的,同時沒有一些從SuperType繼承過來的無用原型屬性。

本面試題為前端常考面試題,后續有機會繼續完善。我是歌謠,一個沉迷于故事的講述者。

歡迎一起私信交流。

“睡服“面試官系列之各系列目錄匯總(建議學習收藏)?

總結

以上是生活随笔為你收集整理的“约见”面试官系列之常见面试题第三十八篇之js常见的继承方式(建议收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产偷人妻精品一区二区在线 | 亚洲av无码国产在丝袜线观看 | 黄色免费网 | 久久这里只有精品久久 | 欧美成人视 | 久久一级黄色片 | 丝袜一区二区三区四区 | 黑人巨大精品一区二区在线 | 91久久精品夜夜躁日日躁欧美 | 精品免费在线视频 | 久久精品国产一区 | 三级黄色在线视频 | 波多野结衣久久 | 粗大的内捧猛烈进出视频 | 免费福利视频网站 | 欧美粗暴jizz性欧美20 | 亚洲色图15p| 能在线观看的av网站 | 久久国产美女 | 少妇高潮灌满白浆毛片免费看 | 亚洲熟妇av一区二区三区 | 天天干中文字幕 | 黄色在线免费观看 | 中文字幕日韩一区二区 | 古代黄色片 | 五月少妇| 蜜桃9999| 久久手机免费视频 | 国产人成视频在线观看 | 农村妇女毛片精品久久久 | 日本一二区视频 | 竹菊影视一区二区三区 | 91av免费在线观看 | 99国产精品欲 | 日韩日日日 | 色婷婷综合久久 | 国产xxxxwwww| 亚洲成人免费观看 | 日本免费无人高清 | 日日操av| av电影一区二区 | 久久男人的天堂 | 国产毛片毛片毛片毛片毛片毛片 | 日韩干| 屁屁影院国产第一页 | 成年视频在线观看 | 亚洲中文字幕无码不卡电影 | 久久人人艹 | 狠狠人妻久久久久久综合麻豆 | 国产蜜臀av一区二区 | 深夜成人在线 | 亚洲欧美日韩精品在线 | 午夜免费剧场 | 亚洲精品中文字幕在线观看 | 欧日韩精品| 亚洲精选一区二区 | 美女裸体网站久久久 | av日韩高清 | 日本一区二区在线免费观看 | 爆操老女人 | 亚洲人在线观看视频 | 国产精品第8页 | 国产视频一区二区三 | www.久久艹| 91黄色免费观看 | av激情久久| 中文字幕一区二区三区在线观看 | 亚洲是色 | 大尺度床戏视频 | 在线免费观看日韩av | 欧美久久一级 | 欧美日韩国产黄色 | 日本大胆人体视频 | wwwjizzzcom| yjizz国产| 少妇欧美激情一区二区三区 | 日本免费www | 日本欧美一区二区三区不卡视频 | 日本黄色播放器 | 亚洲少妇自拍 | 国产高清成人 | 美国毛片av| 国产原创91 | 依人在线视频 | 动漫美女被x| 成人中文字幕在线 | 91免费福利视频 | 少妇无套高潮一二三区 | 国产超碰人人爽人人做人人爱 | 99爱国产| 美女av网站 | 欧美极品喷水 | 欧美中文视频 | 欧美综合一区二区三区 | 在线看a网站 | 极品三级| 九色蝌蚪视频 | 日韩一级片免费 | 欧美精品国产精品 |