2.JavaScript中的原型規則以及原型設計模式

  • 原型規則

    1. 原型規則
      • 全部的引用類型(數組、對象、函數),都具備對象特徵,便可自由擴展屬性;
      • 全部的引用類型,都有一個_proto_ 屬性(隱式原型),屬性值是一個普通對象;
      • 全部函數,都具備一個prototype(顯示原型),屬性值也是一個普通原型;
      • 全部的引用類型(數組、對象、函數),其隱式原型指向其構造函數的顯式原型;(obj.proto === Object.prototype);
      • 當試圖獲得一個對象的某個屬性時,若是這個對象自己沒有這個屬性,那麼會去它的_proto_(即它的構造函數的prototype)中去尋找;
    1. 原型對象:prototype 在js中,函數對象其中一個屬性:原型對象prototype。普通對象沒有prototype屬性,但有_proto_屬性。 原型的做用就是給這個類的每個對象都添加一個統一的方法,在原型中定義的方法和屬性都是被因此實例對象所共享。
      1 var person = function(name){
      2     this.name = name
      3 };
      4 person.prototype.getName=function(){//經過person.prototype設置函數對象屬性
      5     return this.name; 
      6 }
      7 var crazy= new person(‘crazyLee’);
      8 crazy.getName(); //crazyLee//crazy繼承上屬性
    2. 原型鏈  當試圖獲得一個對象f的某個屬性時,若是這個對象自己沒有這個屬性,那麼會去它的_proto_(即它的構造函數的prototype)obj._proto_中去尋找;當obj._proto也沒有時,便會在obj._proto. proto(即obj的構造函數的prototype的構造函數的prototype)中尋找;
  • 設計模式

    • 工廠模式

 

             在函數內建立一個對象,給對象賦予屬性及方法再將對象返回設計模式

 1 function Person() {
 2     var People = new Object();
 3     People.name = 'CrazyLee';
 4     People.age = '25';
 5     People.sex = function(){
 6         return 'boy';
 7     };
 8     return People;
 9 }
10  
11 var a = Person();
12 console.log(a.name);//CrazyLee
13 console.log(a.sex());//boy
  1. 構造函數模式

       無需在函數內部從新建立對象,而是用this指代數組

 1 function Person() {
 2     this.name = 'CrazyLee';
 3     this.age = '25';
 4     this.sex = function(){
 5         return 'boy'
 6     };
 7     
 8 }
 9  
10 var a = new Person();
11 console.log(a.name);//CrazyLee
12 console.log(a.sex());//boy
  1. 原型模式

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

function Parent() {
    Parent.prototype.name = 'carzy';
    Parent.prototype.age = '24';
    Parent.prototype.sex = function() {
        var s="女";
             console.log(s);
    }
}
 
var  x =new  Parent();  
console.log(x.name);      //crazy
console.log(x.sex());       //
  1. 混合模式

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

 1 function Parent(){  
 2     this.name="CrazyLee";  
 3     this.age=24;  
 4 };
 5 Parent.prototype.sayname=function(){  
 6     return this.name;  
 7 };
 8  
 9 var x =new Parent(); 
10 console.log(x.sayname());   //Crazy
  1. 動態原型模式

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

 1 function Parent(){  
 2     this.name="CrazyLee";  
 3     this.age=24;  
 4     if(typeof Parent._sayname=="undefined"){     
 5         Parent.prototype.sayname=function(){  
 6             return this.name;  
 7         }  
 8         Parent._sayname=true;  
 9     }         
10 };   
11  
12 var x =new Parent();  
13 console.log(x.sayname()); 
相關文章
相關標籤/搜索