js中常見繼承方式

来源:https://www.cnblogs.com/angle-xiu/archive/2019/04/29/10793388.html
-Advertisement-
Play Games

1.原型模式 function Father(){ this.property = true; } Father.prototype.getValue = function(){ return this.property; } function Son(){ this.Sonproperty = f ...


1.原型模式

function Father(){ this.property = true;
} Father.prototype.getValue = function(){
return this.property; } function Son(){ this.Sonproperty = false; } //繼承Father Son.prototype = new Father();//原型重寫,contructor被改寫 Son.prototype.construtor = Son;//重新指向Son Son.prototype.getSonValue = function(){ return this.property; } var instance = new Son(); console.log(instance.getValue()); /*缺點: 1.引用原型值會被所有實例共用 2.子類無法向父類傳參 */ 2.借用函數繼承(經典繼承)   //基本思想:在子類型構造函數中調用超類型的構造函數 function Father(){ this.colors = ["red","blue","green"]; name = "haha"; }
function Son(){ Father.call(this);//繼承Father,並向父類型傳參
} Son.prototype = new Father; var instance1 = new Son(); instance1.colors.push("black"); console.log(instance1.colors);
instance2 = new Son(); instance2.colors.push("pink"); console.log(instance2.colors); /* 解決了原型鏈所存在的兩個問題 但是依然存在構造函數方法無法復用的問題 */
3.組合繼承(偽經典繼承)---經常使用   // //集合原型和構造兩者之長 // //基本思想: 使用原型鏈實現對原型屬性和方法的繼承,通過借用構造函數來實現對實例屬性的繼承. function Father(name){ this.name = name; this.colors = ["red","pink","green"]; }
Father.prototype.sayname = function(){ console.log(this.name); }
function Son(name,age){ Father.call(this,name);//使用構造函數進行實例屬性的繼承 this.age = age; }
Son.prototype = new Father();//使用原型鏈繼承超類型方法 Son.prototype.constructor = Son;//重新指向Son Son.prototype.sayage = function(){ console.log(this.age); }
var instance1 = new Son("lisi",12); instance1.colors.push("brown"); console.log(instance1.colors); instance1.sayname(); instance1.sayage();
var instance2 = new Son("hah",22); instance2.colors.push("black"); console.log(instance2.colors); instance2.sayname(); instance2.sayage();

4.原型式繼承(淺拷貝)

//原型式繼承 /*基本思想:在object()函數內部, 先創建一個臨時性的構造函數, 然後將傳入的對象作為這個構造函數的原型,最後返回了這個臨時類型 的一個新實例.*/ var person = { name : "van", friends : ["hah","yisi"] }; var anotherPerson = Object.create(person); anotherPerson.friends.push("yixiu"); console.log(person.friends); /* 和原型模式相同的是所有新對象依然共用含有引用類型值的屬性 */ 5.寄生式繼承   /*寄生式繼承的思路與(寄生)構造函數和工廠模式類似, 即創建一個僅用於封裝繼承過程的函數,該函數在內部以 某種方式來增強對象,最後再像真的是它做了所有工作一樣返回對象.*/ function createAnother(original){ var clone = Object.create(original);//先進行淺複製後增強對象 clone.sayhi = function(){//進行增強 console.log(1); } return clone; } var person = { friends : ["hah","yisi"] }; //缺點:無法進行函數復用,只能使用父類中的方法 // person.prototype.say = function(){ // console.log(2); // } var anotherPerson = createAnother(person); anotherPerson.friends.push("yixiu"); console.log(person.friends); anotherPerson.sayhi(); // anotherPerson.say(); 6.寄生組合式繼承(結合前面的所有優點)   //寄生組合式繼承就是為了降低調用父類構造函數的開銷而出現的 //基本思路是: 不必為了指定子類型的原型而調用超類型的構造函數 function extend(subClass,superClass){ var F = function(){}; F.prototype = superClass.prototype; //subClass.prototype =superClass.prtotype相當於原型共用而非繼承 subClass.prototype = new F();//繼承superClass的原型 subClass.prototype.constructor = subClass;//原型重寫,手動綁定
subClass.superclass = superClass.prototype;//將superClass.prototype緩存起來,方便後續訪問 if(superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } function Father(name){ this.name = name; this.colors = ["red","pink","green"]; }
Father.prototype.sayname = function(){ console.log(this.name); }
function Son(name,age){ Father.call(this,name);//使用構造函數進行實例屬性的繼承,調用第一次 this.age = age; }
extend(Son,Father);// Son.prototype.constructor = Son;//重新指向Son Son.prototype.sayage = function(){ console.log(this.age); }
var instance1 = new Son("lisi",12); instance1.colors.push("brown"); console.log(instance1.colors); instance1.sayname(); instance1.sayage();
var instance2 = new Son("hah",22); instance2.colors.push("black"); console.log(instance2.colors); instance2.sayname(); instance2.sayage();


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在我的上一篇博文當中闡述了我們如何使用shape標簽進行自定義控制項,這裡對shape控制項的屬性進行闡述,不知道如何使用這些屬性的可以參見我的上一篇博文(自定義Button):https://www.cnblogs.com/geeksongs/p/10789671.html 在Android Stud ...
  • 版權聲明:本文為HaiyuKing原創文章,轉載請註明出處! 前言 嘗試的方案包括以下幾種: freemarker 只能在java項目上運行,無法在Android項目上運行; 參考資料:《FreemarkerJavaDemo【Android將表單數據生成Word文檔的方案之一(基於freemarke ...
  • Hi3559AV100 DDR4 驅動配置說明 Hi3559AV100 DDR4 驅動配置說明 1.1 Hi3559AV100 DDR4 CLK/AC 驅動配置方法 1.1 Hi3559AV100 DDR4 CLK/AC 驅動配置方法 寄存器地址 寄存器地址 DDR PHY0:0x1206d0bc ...
  • 不管是系統開發還是應用開發,ANR 一直是揮之不去的存在!本文從 ANR 的觸發機制以及一個簡單的範例來探討 ANR 的原理和處理方法! ...
  • 在筆者本人看了很多博客和書之後,發現很少博主對於自定義控制項能夠進行一個比較全面的思路講解,大多數都是只講了一些細節,但並沒有講如何把代碼進行整體的實現。因此這裡講講整體的自定義button實現的詳細過程,其餘的細節則可以查看其他博主的博客即可,也可以參考《Android開發藝術探索》這本書的第六章, ...
  • AndroidStduio3.0使用gradle將module打包jar文件,首先需要安裝gradle。 打開控制台輸入 open -e .bash_profile 命令,就可以打開配置文件的文本,在裡面添加 然後進行保存。在輸入 source .bash_profile 命令保存你的設置。 在控制 ...
  • 一、項目介紹 基於Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技術混合架構開發的仿微信web端聊天室——vueWebChat,實現了發送消息、表情(動圖),圖片、視頻預覽,右鍵菜單、截屏、截圖可直接粘貼 ...
  • ajax 全稱為 “Asynchronous JavaScript and XML”(非同步 JavaScript 和 XML),是一種創建互動式網頁應用的網頁開發技術,本質上是一個瀏覽器端的技術,就是在不跳轉頁面的情況下,實現對伺服器的訪問並返回數據,將數據局部非同步刷新在網頁中的技術 ajax 不是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...