javascript筆記3-面向對象的程式設計-創建對象

来源:http://www.cnblogs.com/mesopotamia/archive/2016/02/09/5185699.html
-Advertisement-
Play Games

javascript面向對象的程式設計-創建對象;理解對象、屬性、方法、引用類型、基本類型、原型模式;創建對象的幾種方法。


javascript的對象:無序屬性的集合,而每個屬性可以包含基本值、對象或者函數。舉例:

1  var person = new Object();
2         person.name = "Nicholas";
3         person.age = 29;
4         person.job = "Software Engineer";
5         person.sayName = function(){
6             alert(this.name);
7         };
8         
9         person.sayName();

person是一個對象,name、age、job、sayName都是對象的屬性。其中,sayName是一個特殊的屬性,它有一個函數。

實際上,函數也是一個Function類型,是個引用類型,而對象也是一個引用類型,如此可以重新描述javascript對象:對象擁有一些屬性,每個屬性又可以包含基本類型、引用類型。

  1. 對象的創建:
    • 創建一個Object實例,然後添加屬性:
      1  var person = new Object();
      2         person.name = "Nicholas";
      3         person.age = 29;
      4         person.job = "Software Engineer";
      5         person.sayName = function(){
      6             alert(this.name);
      7         };
      8         
      9         person.sayName();

       

    • 直接使用字面量:
      var person={
        name : "JAY",
        age : 29,
        job : 'singer',
        sayName : function(){
         alert(this.name);
       }   
       
      };

       

  2. 創建對象的策略
    • 工廠模式把創建對象的過程封裝起來,讓代碼更加整潔):
      function createPerson(name, age, job){
                  var o = new Object();
                  o.name = name;
                  o.age = age;
                  o.job = job;
                  o.sayName = function(){
                      alert(this.name);
                  };    
                  return o;
              }
              
              var person1 = createPerson("Nicholas", 29, "Software Engineer");
              var person2 = createPerson("Greg", 27, "Doctor");

      缺點:對象是創建了,但是如果你問person1、person2是什麼類型的,無法識別出。解決方法:構造函數模式。

    • 構造函數模式:
      function Person(name, age, job){
                  this.name = name;
                  this.age = age;
                  this.job = job;
                  this.sayName = function(){
                      alert(this.name);
                  };    
              }
              
              var person1 = new Person("Nicholas", 29, "Software Engineer");
              var person2 = new Person("Greg", 27, "Doctor");
      • 優點:可以知道對象的類型(Person)。
        構造函數也是函數。
        
        任何函數使用new就變成了構造函數(只不過約定俗成構造函數第一個字母大寫),不用new就是一般函數。 
      • 缺點:sayName是一個函數(函數是對象,是引用類型),每次new一個Person,都要重新創建sayName的實例。解決方法:原型模式。
    • 原型模式實例共用屬性和方法

      創建函數時會加屬性,而每個函數都有一個隱藏屬性:prototype(原型)。
      prototype是一個指針,指向一個對象,該對象包含了所有實例共用的一些屬性和方法。

      function Person(){
              }
              
              Person.prototype.name = "Nicholas";
              Person.prototype.age = 29;
              Person.prototype.job = "Software Engineer";
              Person.prototype.sayName = function(){
                  alert(this.name);
              };
              
              var person1 = new Person();
              person1.sayName();   //"Nicholas"
              
              var person2 = new Person();
              person2.sayName();   //"Nicholas"
            
              alert(person1.sayName == person2.sayName);  //true

      跟父類很類似。這時,person1和person2的sayName是同一個引用。

      • 創建一個新函數A,就會自動為該函數創建prototype屬性。這個屬性指向該函數的原型對象B。
      • B有一個constructor屬性,該屬性包含一個指向A的指針。

      • 通過B.isPrototypeof(Person1)來確定原型關係。
      • 不能通過對象實例來修改原型的屬性值。
        function Person(){
                }
                
                Person.prototype.name = "Nicholas";
                Person.prototype.age = 29;
                Person.prototype.job = "Software Engineer";
                Person.prototype.sayName = function(){
                    alert(this.name);
                };
                
                var person1 = new Person();
                var person2 = new Person();
                
                person1.name = "Greg";
                alert(person1.name);   //"Greg" ?from instance
                alert(person2.name);   //"Nicholas" ?from prototype

         

      • 更簡單的原型語法:
         function Person(){
                
        }
                
        Person.prototype = {
                    name : "Nicholas",
                    age : 29,
                    job: "Software Engineer",
                    sayName : function () {
                        alert(this.name);
                    }
         };

        該方式中,constructor屬性不再指向Person。(因為創建一個函數會生成一個prototype屬性,該屬性指向原型對象的地址,原型對象的constructor屬性又指向Person,而在本方式中,prototype被重寫,那麼導致生成的原型對象B不是原汁原味的原型對象了,這麼一來,B的constructor也就不再指向A了)。

 

      

 

  

   


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

-Advertisement-
Play Games
更多相關文章
  • DOM(文檔對象模型)是針對HTML和XML文檔的一個API。DOM描繪了一個層次化的節點樹,允許程式員添加、修改頁面的一部分。
  • 什麼是函數: 函數是完成某一功能的代碼段。 函數是可重覆執行的代碼段。 函數方便管理和維護。 自定義一個函數: 通過function關鍵字來定義一個函數。 語法: function 函數名稱([可以帶參數,也可以不帶參數,可以帶一個參數,可以帶多個參數]){ 執行的代碼段; return返回值; }
  • 條件語句: if(exp)執行一句代碼 1 <script> 2 var x = 1 ; 3 if(x == 1 ) //當if判斷語句結果是true 或者 false 當判斷結果等於true的時候,執行一句語句 4 document.write("x真的等於1") //=>x真的等於1 5 </s
  • 三元運算符: 語法為 exp1? exp2:exp3 判斷 exp1是true 和 false 如果true,則返回exp2 ,如果false ,則返回exp3 1 <script> 2 if(5>1){ 3 alert("true") 4 }else{ 5 alert("false") 6 } 7
  • 1,創建函數的方式;2,遞歸的方法;3.閉包。4,this對象;5.私有作用域;6,私有變數;7,特權方法
  • 比較運算符: > 、>= 、<、 <=、 ==、 !=、 ===、 !==、 比較運算符的結果都為布爾值 ==只比較值是否相等 而 ===比較的是值和數據類型都要相等 1 <script> 2 var a = 5,b = 10; 3 alert(a>b) //=>false 4 alert(a>=b
  • 有前輩說過,在JavaScript中,一切皆對象。由此可見,作為JavaScript的核心之一,對象是有多麼重要。雖然今天走親戚有點累,但還是得寫寫這個對象,免得吃幾天好的,就又忘光了。 1.創建對象 通過內置對象創建: var obj1 = new Object(); typeof obj1; /
  • 表單標簽在網站中主要負責的是進行與用戶間的交互, 如果沒有了交互, 那麼網站就只是一個展示, 會死氣沉沉的. <form>表單標簽 <form>表單標簽可以把瀏覽者(也就是我們用戶自己)輸入的數據傳送到伺服器端, 這樣伺服器程式就可以處理表單傳過來的數據, 完成與用戶的交互, 在任何的開發中, 交互
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...