JS面向對象——原型模型

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

以下通過一段示例代碼,說明原型模型中的基本概念以及知識點。 部分摘自《JavaScript高級程式設計(第3版)》 ...


以下通過一段示例代碼,說明原型模型中的基本概念以及知識點。

<!DOCTYPE html>
<html>
<head>
    <title>原型模型</title>
    <script type="text/javascript">
        function Person(){};

        // Person.prototype.name="Lucy";
        // Person.prototype.age=15;
        // Person.prototype.sayName=function(){
        //     alert(this.name);
        // };

        //3.更簡單的原型語法
        Person.prototype={
            constructor:Person,//若constructor屬性值真的很重要,則需要手動設置回適當的值。
            name:"Lucy",
            age:15,
            sayName:function(){
                alert(this.name);
            }
        };

        // var p1,p2;
        p1=new Person();
        p2=new Person();
        //hasOwnProperty()檢測一個屬性存在於實例中(true),還是存在於原型中(false)
        alert(p1.hasOwnProperty("name"));//false
        p1.name="Bob";
        p1.job="student";//設置實例屬性
        alert(p1.name);//"Bob",來自實例
        alert(p1.hasOwnProperty("name"));//true

        alert(p1.sayName==p2.sayName);//true 檢查實例是否共用方法
        alert(p1.job);        
        alert(p1.hasOwnProperty("age"));//false
        alert(p1.hasOwnProperty("job"));//true

        // /*********************************** 2.原型與in操作符 *********************************************/

        // /********單獨使用in操作符********/
        // 通過對象能夠訪訪問到屬性時,返回true
        alert("job" in p1);//true
        alert("age" in p1);//true
        alert("name" in p1);//true
        alert("name" in p2);//true

        //該函數確定屬性是存在於原型對象中還是存在於實例對象中。 true:屬性為原型對象屬性;false:為實例對象屬性。
        function hasPrototypeProperty(object,name){
            return !object.hasOwnProperty(name)&&(name in object);
        }
        alert(hasPrototypeProperty(p1,"job"));
        alert(hasPrototypeProperty(p2,"name"));
        // /******************************/

        // /********for-in ***********/
        // 返回的是所有能夠通過對象訪問的、可枚舉的屬性,其中包括存在於原型中的屬性、也包括存在於實例中的屬性。
        // Object.keys(object):接收一個對象作為參數,返回一個包含所有可枚舉屬性的字元串數組。
        var keys=Object.keys(Person.prototype);
        alert(keys);//"name,age,sayName" 
        var p1keys=Object.keys(p1);
        alert(p1keys);//"name,job"

        //順序即為for-in訪問時的順序
        for(var prop in p1keys){
            alert(p1keys[prop]);
        }

        //Object.getOwnPropertyNames(object) 獲取實例所有屬性,包括不可枚舉屬性
        var p1allkeys=Object.getOwnPropertyNames(p1);
        alert(p1allkeys);//"name,job"        
        var p1allkeys=Object.getOwnPropertyNames(Person.prototype);
        alert(p1allkeys);//constructor,name,age,job,sayName   constructor屬性為不可枚舉
        // /******************************/
        //  /*****************************************************************************************/


        /************************************ 3.更簡單的原型語法 ****************************************/
        //設置為簡單的原型語法後,Person.prototype設置為一個以對象字面量形式創建的新對象。最終結果相同,不過對象的constructor屬性不再指向Person。
        //若constructor屬性值真的很重要,則需要手動設置回適當的值。
        var friend=new Person();
        alert(friend instanceof Object);//true
        alert(friend instanceof Person);//true
        alert(friend.constructor==Person);//false
        alert(friend.constructor==Object);//true

        var keys2=Object.keys(Person.prototype);
        alert(keys2);//constructor,name,age,job,sayName   //簡單原型語法中手動設置constructor屬性之後,會導致它的[Enumerable]特性值為true,預設情況下原生的constructor值為false
        //重設構造函數,只適用於ECMAScript5相容瀏覽器
        Object.defineProperty(Person.prototype,"constructor",{
            enumerable:false,
            value:Person
        });
        var keys3=Object.keys(Person.prototype);
        alert(keys3);//name,age,job,sayName //
         /**********************************************************************************************/


        /************************************ 4.原型的動態性 ****************************************/
        var per=new Person();
        //可以隨時為原型添加屬性和方法,並且所有的修改能夠立即在所有對象實例中反映出來。        
        Person.prototype.sayHi=function(){
            alert("Hi!");
        }
        per.sayHi();


        //若重構整個原型對象,就會在調用構造函數時為實例添加一個指向最初原型的[Prototype]指針,而把原型修改為另外一個對象就等於切斷了構造函數與最初原型之間的聯繫。
        //實例中的指針僅指向原型,而不是構造函數。
        function Student(){};        
        var st=new Student();//先創建實例對象            
        Student.prototype={//重構原型對象原型
            constructor:Student,
            name:"Nike",
            age:20,
            speakEnglish:function(){
                alert("Hello!");
            }
        };
        st.speakEnglish();//error  0: Object doesn't support property or method 'speakEnglish'
        //  /**********************************************************************************************/


        /************************************ 5.原型的問題 ****************************************/
        //原型中所有屬性是被很多實例共用的,這種共用對於函數非常適合。對於包含基本值得屬性也沒有什麼,通過在實例上添加一個同名屬性就可以隱藏原型中對應的屬性。
        //然而,對於包含引用類型的值來說,就會存在問題。如下例所示。
        function Singer(){};                
        Singer.prototype={
            constructor:Singer,
            name:"Nike",
            age:30,
            albums:["Suger","Live"]//"Suger","Live"是所有實例對象的共用albums集合
        };
        var s1=new Singer();
        var s2=new Singer();
        s1.albums.push("Flowers");//“Flowers”是s1的唱片集
        alert(s1.albums);//"Suger","Live","Flowers"
        alert(s2.albums);//"Suger","Live","Flowers",而"Flowers"不是s2的唱片
        alert(s1.albums===s2.albums);//指向同一個albums 
        /**********************************************************************************************/
    </script>
</head>
<body>

</body>
</html>

部分摘自《JavaScript高級程式設計(第3版)》


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

-Advertisement-
Play Games
更多相關文章
  • 一、邊框屬性 1.連寫(分別設置四條邊的邊框) 註意點: (1)這三個屬性是按照順時針來賦值的,也就是說按照上右下左來賦值,而不是按照日常生活中的上下左右 (2)關於省略 i.三個(省略左)左右一樣,上下按照咱們寫的 ii.兩個(省略左、下)左右一樣,上下一樣 ii.一個(省略右、左、下)這四個全都 ...
  • 動態原型模型 組合使用構造函數模型和原型模型,使得OO語言程式員在看到獨立的構造函數和原型時很困惑。動態原型模型致力於解決該問題,它把所有的信息封裝在構造函數中,通過在構造函數中初始化原型(僅在必要情況下),同時又使用構造函數和原型的優點。 實例代碼如下: 寄生構造函數模型 基本思想:創建一個函數, ...
  • 該模型為創建自定義類型最常用的方式。 部分摘自《JavaScript高級程式設計(第3版)》 ...
  • 今天在學習查閱代碼的時候,發現了一個不認識的CSS代碼,於是進行學習。 效果圖 使圖片在對應的元素內以不同的方式進行垂直對齊 ...
  • 工廠模型抽象了創建具體對象的過程,以下示例代碼說明工廠類型: 部分摘自《JavaScript高級程式設計(第3版)》 ...
  • JavaScript 基礎入門 JavaScript 的組成 JS 由三部分組成,它們分別是:ECMAScript、DOM、BOM. ECMAScript 因為網景開發了JavaScript,一年後微軟又模仿JavaScript開發了JScript,為了讓JavaScript成為全球標準,幾個公司聯 ...
  • <!DOCTYPE>標簽的定義 <!DOCTYPE> 聲明位於文檔中最前面的位置,處於<html>標簽之前。<!DOCTYPE> 聲明不是一個HTML標簽,它是告知Web瀏覽器該頁面使用了哪種HTML版本(規範),瀏覽器用此版本(規範)對該文檔進行解析,渲染。 <!DOCTYPE> 可聲明的 DTD ...
  • 利用快速原型獲取軟體需求 在客戶 開發商 用戶 之間 旨在啟發客戶 引導客戶真正知道和瞭解自己的可行需求 快速搭建原型 高效準確地確定用戶需求 我們可能要用到一個軟體需求方面的知識-快速原型 例子 以CSS語言為例從一個最最最的教務系統入手 代碼如下: <html><center><h2>歡迎返校! ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...