JS面向對象——動態原型模型、寄生構造模型

来源:https://www.cnblogs.com/planetwithpig/archive/2019/09/17/11531122.html
-Advertisement-
Play Games

動態原型模型 組合使用構造函數模型和原型模型,使得OO語言程式員在看到獨立的構造函數和原型時很困惑。動態原型模型致力於解決該問題,它把所有的信息封裝在構造函數中,通過在構造函數中初始化原型(僅在必要情況下),同時又使用構造函數和原型的優點。 實例代碼如下: 寄生構造函數模型 基本思想:創建一個函數, ...


動態原型模型

組合使用構造函數模型和原型模型,使得OO語言程式員在看到獨立的構造函數和原型時很困惑。動態原型模型致力於解決該問題,它把所有的信息封裝在構造函數中,通過在構造函數中初始化原型(僅在必要情況下),同時又使用構造函數和原型的優點。

實例代碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>動態原型模型</title>
    <script type="text/javascript">
        //動態原型模型:把所有的信息封裝在構造函數中。通過在構造函數中初始化原型(僅在必要情況),又保持了同時使用構造函數和原型模型的優點。    
        function Student(name,age,sex){            
            this.name=name;
            this.age=age;
            this.sex=sex;
            this.friends=["Kitty","Court"];    
            if(typeof this.sayName!="function"){
                //不能使用對象字面量重寫原型
                Student.prototype.sayName=function(){
                alert(this.name);
                };
            }
        }

        var stu1=new Student("Lucy",10,"girl");
        stu1.sayName();
        var stu2=new Student("Bob",9,"boy");
        stu2.sayName();        
        stu1.friends.push("Van");
        alert(stu1.friends);//"Kitty,Court,Van"
        alert(stu2.friends);//"Kitty,Court"
        alert(stu1.friends===stu2.friends);//false
        alert(stu1.sayName===stu2.sayName);//true
    </script>
</head>
<body>
</body>
</html>

寄生構造函數模型

基本思想:創建一個函數,該函數作用僅僅是封裝創建對象的代碼,然後返回新創建的對象。

以下代碼說明該模型基本思想:

<!DOCTYPE html>
<html>
<head>
    <title>寄生構造函數模型</title>
    <script type="text/javascript">            
        function Student(name,age,sex){    
            var  o=new Object();    
            o.name=name;
            o.age=age;
            o.sex=sex;
            o.friends=["Kitty","Court"];    
            o.sayName=function(){
                alert(this.name);
                };
            return o;
        }

        var stu1=new Student("Lucy",10,"girl");
        stu1.sayName();
        alert(stu1 instanceof Student);    //false
        alert(stu1 instanceof Object);//true
    </script>
</head>
<body>
</body>
</html>

註:返回的對象與構造函數或者與構造函數的原型屬性之間沒有任何關係;即:構造函數返回的對象與在構造函數外部創建的對象沒什麼不同。不能依賴instanceof操作符來確定對象類型。

這種模式常用在特殊情況下為對象創建構造函數。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、集群管理 前臺啟動broker Ctrl + C 關閉 後臺啟動broker 關閉broker 2、Topic管理 創建topic 刪除topic 查詢topic列表 查詢topic詳情 修改topic 3、Consumer Groups管理 查詢消費者組 查詢消費者組詳情 重設消費者組位移 刪 ...
  • 前言 開心一刻 感覺不妙呀,弟弟舔它! 不該舔的,舔到懷疑人生了...... GROUP BY 後 SELECT 列的限制 標準 SQL 規定,在對錶進行聚合查詢的時候,只能在 SELECT 子句中寫下麵 3 種內容:通過 GROUP BY 子句指定的聚合鍵、聚合函數(SUM 、AVG 等)、常量。 ...
  • 一 存儲引擎解釋 首先確定一點,存儲引擎的概念是MySQL裡面才有的,不是所有的關係型資料庫都有存儲引擎這個概念,後面我們還會說,但是現在要確定這一點。 在講清楚什麼是存儲引擎之前,我們先來個比喻,我們都知道錄製一個視頻文件,可以轉換成不同的格式,例如mp4,avi,wmv等,而存在我們電腦的磁碟上 ...
  • 免安裝版的Mysql MySQL關是一種關係資料庫管理系統,所使用的 SQL 語言是用於訪問資料庫的最常用的 標準化語言,其特點為體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,在 Web 應用方面 MySQL 是最好的 RDBMS(Relational Database Managemen ...
  • 工具類 在開發的過程中,我們時常會對代碼執行特定的處理,而這部分處理在代碼中可能多次用到,為了代碼的統一性、規範性等,通過建工具類的方式統一處理。接下來我會羅列各種工具類。 日誌工具類 在utils文件夾下建立一個 LogUtils 類 在build.gradle中配置buildType,設置不同版 ...
  • 修改前 修改後 6.0 Recovery 模式橫屏修改方法 修改相關文件 bootable\recovery\minui\Android.mk bootable\recovery\minui\mt_graphic_rotate.cpp bootable\recovery\minui\mt_graph ...
  • 最近一直在學習uni-app開發,由於uniapp是基於vue.js技術開發的,只要你熟悉vue,基本上很快就能上手了。 在開發中發現uni-app原生導航欄也能實現一些頂部自定義按鈕+搜索框,只需在page.json裡面做一些配置即可。設置app-plus,配置編譯到App平臺的特定樣式。dclo ...
  • 一、邊框屬性 1.連寫(分別設置四條邊的邊框) 註意點: (1)這三個屬性是按照順時針來賦值的,也就是說按照上右下左來賦值,而不是按照日常生活中的上下左右 (2)關於省略 i.三個(省略左)左右一樣,上下按照咱們寫的 ii.兩個(省略左、下)左右一樣,上下一樣 ii.一個(省略右、左、下)這四個全都 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...