首頁 web前端 js教程 javascript 物件導向封裝與繼承_javascript技巧

javascript 物件導向封裝與繼承_javascript技巧

May 16, 2016 pm 04:30 PM
javascript 封裝 繼承 物件導向

  整理一下js物件導向中的封裝與繼承。

1.封裝
  js中封裝有很多種實作方式,這裡列出常用的幾種。

1.1 原始模式產生物件
  直接將我們的成員寫入物件中,用函數回傳。 缺點:很難看出是一個模式出來的實例。

代碼:

複製程式碼 程式碼如下:

       function Stu(name, score) {
            return {
                name: name,
                score: score
            }
        }
        var stu1 = Stu("張三", 80);
        var stu2 = Stu("李四", 90);
        console.log(stu1.name); // 張三

1.2 產生建構模式物件

  js幫我們提供了一個使用建構函數來產生物件的模式,¨所謂“建構函數”,其實就是一個普通函數,但是內部使用了this變數。當使用new關鍵字對建構函式產生實例後,this變數則會綁定在實例物件上。

  直接上碼:

複製程式碼 程式碼如下:

      function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        var stu1 = new Stu("張三", 80);
        var stu2 = new Stu("李四", 90);
        console.log(stu1.name "/" stu2.score); // 張三  90
        console.log((stu1.constructor == Stu) "/" (stu2.constructor == Stu)); // true  true
        console.log((stu1 instanceof Stu) "/" (stu2 instanceof Stu)); // true  true

  不難看出js的建構子生成物件和C#用class產生物件如出一轍,都是用模板定義物件成員透過new關鍵字實例化。

用C#程式碼產生同樣的Stu物件

複製程式碼 程式碼如下:

Class Stu
{
  public string name;
  public double score;                   
}

  ok,到這兒基本的對像有了。 那麼現在我們需要一個所有物件都公用的方法,而且只讓這個方法創建一次。 (不隨著物件new而重複創建)  怎麼辦呢? 大家都知道C#我們可以用靜態成員。那麼在js中怎麼做呢?

1.3 Prototype模式

  在js中,每一個建構函式都有一個prototype屬性,這個物件的所有屬性和方法,都會被建構函式的實例繼承。那我們直接為prototype新增成員就相當於在C#中宣告靜態成員了。

代碼:

複製程式碼 程式碼如下:

      function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        Stu.prototype.type='學生';
        Stu.prototype.log = function (s) {
            console.log(s);
        }
        var stu1 = new Stu("張三", 80);
        var stu2 = new Stu("李四", 90);
        console.log(stu1.type "/" stu2.type); // 學生 學生
        stu1.log('hello');  // hello
        console.log(stu1.log == stu2.log);  // true

封裝就講到這裡了,下面我們來看看js中繼承又是如何實現的?

2.繼承

2.1 建構子綁定

  在子函式中直接呼叫 call或apply方法,將父物件的建構子綁定在子物件上。
 

複製程式碼 程式碼如下:

   function Stu(name, score) {
            Grade.apply(this, arguments);
            //Grade.call(this, arguments);
            this.name = name,
            this.score = score
        }
        function Grade() {
            this.code = "國中";
            this.ask = function () {
                console.log("大家好");
            }
        }
        var stu1 = new Stu("張三", 80);
        var stu2 = new Stu("李四", 90);
        console.log(stu1.code); // 國中
        stu1.ask(); // 大家好

  這裡的apply做了兩件事情,把第一個參數this給Grade建構子(呼叫者),然後再執行Grade裡的程式碼。就相當於將Grade中用this定義的成員在Stu中再執行一次。

2.2 透過prototype繼承
  先看程式碼

代碼:

複製程式碼 程式碼如下:

    function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        function Grade() {
            this.code = "國中";
        }
        Stu.prototype = new Grade();
        Stu.prototype.constructor = Stu; //防止繼承鏈的紊亂,手動重置宣告
        var stu1 = new Stu("張三", 80);
        var stu2 = new Stu("李四", 90);
        console.log(Stu.prototype.constructor); // 自己的建構子
        console.log(stu1.code); // 國中

前面說過prototype就相當於C#中的靜態成員,所以我們就把父類別的所有成員都變成自己的靜態成員來實現繼承。

  透過prototype繼承有一個缺點:所有繼承的成員都是靜態的,那麼怎麼繼承物件成員呢?

2.3 拷貝繼承

  把父對象的所有屬性和方法,拷貝進子對象,實現繼承。

代碼:

複製程式碼 程式碼如下:

    function Stu(name, score) {
            this.name = name,
            this.score = score
        }
        function Grade() {}
        Grade.prototype.code = "國中";
    }
        //函數封裝
        function extend(C, P) {
            var p = P.prototype;
            var c = C.prototype;
            for (var i in p) {
                c[i] = p[i];
            }
        }
        extend(Stu, Grade);
        var stu1 = new Stu("張三", 80);
        var stu2 = new Stu("李四", 90);
        stu1.code='高中';
        console.log(stu1.code); // 高中
        console.log(stu2.code); // 國中
        console.log(Stu.prototype.constructor);
        console.log(Grade.prototype.constructor)

    js物件導向的整理就寫到這了,這個東西也不是一成不變的,使用的時候依照自己的需求做改變。  有句話說的很好,對的才是最好的。

這裡只針對封裝和繼承進行了分析,後續我們再做一些其他方面的文章,讓小夥伴們更加深入的了解javascript物件導向程式設計。當然都是個人的一些理解,如有遺漏,請聯絡我。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C++ 函式繼承詳解:如何在繼承中使用「基底類別指標」和「衍生類別指標」? C++ 函式繼承詳解:如何在繼承中使用「基底類別指標」和「衍生類別指標」? May 01, 2024 pm 10:27 PM

在函數繼承中,使用「基底類別指標」和「衍生類別指標」來理解繼承機制:基底類別指標指向派生類別物件時,執行向上轉型,只存取基底類別成員。派生類別指標指向基底類別物件時,執行向下轉型(不安全),必須謹慎使用。

集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% 集邦諮詢:英偉達 Blackwell 平台產品帶動台積電今年 CoWoS 產能提升 150% Apr 17, 2024 pm 08:00 PM

本站4月17日消息,集邦諮詢(TrendForce)近日發布報告,認為英偉達Blackwell新平台產品需求看漲,預估帶動台積電2024年CoWoS封裝總產能提升逾150%。英偉達Blackwell新平台產品包含B系列的GPU,以及整合英偉達自家GraceArmCPU的GB200加速卡等。集邦諮詢確認為供應鏈目前非常看好GB200,預估2025年出貨量預計超過百萬片,在英偉達高階GPU中的佔比達到40-50%。在英偉達計畫下半年交付GB200以及B100等產品,但上游晶圓封裝方面須進一步採用更複

C++ 函式繼承詳解:如何偵錯繼承中出現的錯誤? C++ 函式繼承詳解:如何偵錯繼承中出現的錯誤? May 02, 2024 am 09:54 AM

繼承錯誤調試技巧:確保正確的繼承關係。使用偵錯器逐步執行程式碼,檢查變數值。確保正確使用virtual修飾符。檢查隱藏的繼承帶來的菱形繼承問題。檢查抽象類別中未實現的純虛函數。

C++ 函式繼承詳解:如何理解繼承中的「is-a」與「has-a」關係? C++ 函式繼承詳解:如何理解繼承中的「is-a」與「has-a」關係? May 02, 2024 am 08:18 AM

C++函式繼承詳解:掌握「is-a」和「has-a」關係什麼是函式繼承?函數繼承是C++中一種將衍生類別中定義的方法與基底類別中定義的方法關聯起來的技術。它允許衍生類別存取和重寫基底類別的方法,從而擴展了基底類別的功能。 「is-a」和「has-a」關係在函數繼承中,「is-a」關係指派生類別是基底類別的子類型,也就是說,衍生類別「繼承」了基底類別的特性和行為。 「has-a」關係指派生類別包含對基底類別物件的參考或指針,也就是說,衍生類別「擁有」了基底類別物件。語法以下是如何實作函數繼承的語法:classDerivedClass:pu

AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% AMD 'Strix Halo” FP11 封裝尺寸曝光:和英特爾 LGA1700 相當,比 Phoenix 大 60% Jul 18, 2024 am 02:04 AM

本站7月9日訊息,AMDZen5架構「Strix」系列處理器會有兩種封裝方案,其中較小的StrixPoint將採用FP8封裝,而StrixHalo將會採用FP11封裝。圖源:videocardz訊息源@Olrak29_最新曝料稱StrixHalo的FP11封裝尺寸為37.5mm*45mm(1687平方毫米),和英特爾AlderLake、RaptorLakeCPU的LGA-1700封裝尺寸相同。 AMD最新的PhoenixAPU採用FP8封裝方案,尺寸為25*40mm,這意味著StrixHalo的F

探索Go語言中的物件導向編程 探索Go語言中的物件導向編程 Apr 04, 2024 am 10:39 AM

Go語言支援物件導向編程,透過型別定義和方法關聯實作。它不支援傳統繼承,而是透過組合實現。介面提供了類型間的一致性,允許定義抽象方法。實戰案例展示如何使用OOP管理客戶訊息,包括建立、取得、更新和刪除客戶操作。

C++ 中繼承和多態性如何影響類別的耦合度? C++ 中繼承和多態性如何影響類別的耦合度? Jun 05, 2024 pm 02:33 PM

繼承和多態性會影響類別的耦合度:繼承會增加耦合度,因為衍生類別依賴基底類別。多態性可以降低耦合度,因為物件可以透過虛擬函數和基底類別指標以一致的方式回應訊息。最佳實踐包括謹慎使用繼承、定義公共介面、避免在基底類別中新增資料成員,以及透過依賴注入解耦類別。實戰案例顯示如何使用多態性和依賴注入來降低銀行帳戶應用程式中的耦合度。

C++ 函式如何透過封裝程式碼來提高 GUI 開發的效率? C++ 函式如何透過封裝程式碼來提高 GUI 開發的效率? Apr 25, 2024 pm 12:27 PM

透過封裝程式碼,C++函數可以提高GUI開發效率:程式碼封裝:函數將程式碼分組到獨立單元,使程式碼易於理解和維護。可重複使用性:函數可建立通用功能供應用程式中重複使用,減少重複編寫和錯誤。簡潔程式碼:封裝程式碼讓主邏輯簡潔,方便閱讀和除錯。

See all articles