JS原型+原型鏈+設計模式

JavaScript是一種基於對象的語言,JavaScript中的全部對象,都具備prototype屬性。prototype屬性返回對象的全部屬性和方法,全部 JavaScript 內部對象都有隻讀的 prototype 屬性,能夠向其原型中動態添加屬性和方法,但該對象不能被賦予不一樣的原型。可是自定義的對象能夠被賦給新的原型。設計模式

對象分爲函數對象和普通對象,區分:凡是經過 new Function() 建立的對象都是函數對象,其餘的都是普通對象。(Object ,Function 是JS自帶的函數對象)函數

1.原型對象:prototypethis

 在JS 中,函數對象其中一個屬性:原型對象 prototype。普通對象是沒有prototype屬性,但有__proto__屬性。spa

原型的做用就是給這個類的每個對象都添加一個統一的方法,在原型中定義的方法和屬性都是被因此實例對象所共享。prototype

   例:設計

      var person = function(name){
         this.name = name
      };
      person.prototype.getName = function(){//經過person.prototype設置函數對象屬性
           return this.name; 
      }
      var zxj= new person(‘zhangxiaojie’);
      zxj.getName(); //zhangxiaojie       //zxj繼承上屬性對象

2.原型鏈繼承

 __proto__:js建立對象的內置屬性,用於指向建立它的函數對象的原型對象prototype。(是JS內部使用尋找原型鏈的屬性。當實例化一個對象時候,內部會新建一個__proto__屬性並把prototype賦值給它)ip

    下圖爲原型鏈運行圖解,當咱們實例一個對象以後,調用它的內部方法,他的運行順序是先找自身有沒有該方法,若是沒有就會經過__proto__屬性想上層尋找,一直尋找到Object對象中,若是尚未纔會報錯null原型鏈

        p._proto_----->Persion._proto_---->object._proto_----->null

 

3.設計模式

(1)工廠模式:在函數內建立一個對象,給對象賦予屬性及方法再將對象返回。

      function Parent(){  
             var  Child = new Object();  
             Child.name="ZXJ";  
             Child.age="24";

      Child.sex=function(){  

             return "女";  
         };   
           return Child;  
      };  
      調用:
      var  x =Parent();  

      alert(x.name);      //ZXJ
      alert(x.sex());       //女

(2)構造函數模式:無需再函數內部重建建立對象,而使用this指代

     function Parent(){  

              var  Child = new Object();  
              this.name="ZXJ";  
              this.age=24";  
              this.lev=lev;  

      Child.sex=function(){  

             return "女";  
          };   
             return Child;  
        };  
        調用:
        var  x = new Parent();  
        alert(x.name);      //ZXJ
        alert(x.sex());       //女

  (3)原型模式:函數中不對屬性進行定義,利用prototype屬性對屬性進行定義,能夠讓全部對象實例共享它所包含的屬性及方法。

    function Parent(){   };  
          Parent.prototype.name="ZXJ";  
          Parent.prototype.age="24";  
          Parent.prototype.sex=function(){

        var s="女";

        alert(s);

      };  
    

     調用:
        var  x =new  Parent();  
        alert(x.name);      //ZXJ
           alert(x.sex());       //女

 

  (4)混合模式:原型模式+構造函數模式。這種模式中,構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享屬性。

     function Parent(){  
          this.name="ZXJ";  
          this.age=24;  
      };
      Parent.prototype.sayname=function(){  
         return this.name;  
      };
      調用:
      var  x =new  Parent(); 
      alert(x.sayname());   //ZXJ  

 

  (5)動態原型模式:將全部信息封裝在了構造函數中,而經過構造函數中初始化原型,這個能夠經過判斷該方法是否有效而選擇是否須要初始化原型。

 

    function Parent(){          this.name="ZXJ";          this.age=24;         if(typeof Parent._sayname=="undefined"){                Parent.prototype.sayname=function(){                     return this.name;             }              Parent._sayname=true;          }                 };        調用:     var  x =new  Parent();      alert(x.sayname());  

相關文章
相關標籤/搜索