javascript模擬面向對象的類

模擬面向對象的類
第一種方法:html

//定義類屬性和方法方法之一
function Test(){
    this.id = 001;
    this.name = "Tom";
    this.fun = function(){};
}
//定義類屬性和方法方法之二
Test.prototype.otherName = "Lucy";
//訪問
var test = new Test();
alert(test.name);
alert(test.otherName);

第二種方法:html5

缺點:不能實現私有屬性和私有方法,實例對象之間也不能共享數據(也就是沒法實現static)。chrome

//類的定義
var Test = {
    name: "hehe",
    fun: function(){}
};
//類的實例化
var test = Object.create(Test);
alert(test.name);
test.fun();

//************************************
//注意:Object.create()方法是Javascript的國際標準ECMAScript第五版(目前通行的是第三版),提出的,IE9+以及firefox、chrome等支持(也就是支持html5的基本都支持),IE8-不支持。
//遇到不支持的瀏覽器,使用一下兼容代碼。
//************************************
if (!Object.create) {
    Object.create = function (o) {
       function F() {}
      F.prototype = o;
      return new F();   //至關於第一種實現類的方法
    };
  }

第三種方法:瀏覽器

//思路
var Tom = {
    //定義一個構造函數
    creat: function(){
        //在這個構造函數中定義一個對象,做爲返回值
        //那麼,在使用的時候,直接Tom.creat()就能夠實例化對象了
        var test = {};
        test.name = "jack";
        test.fun = function(){};
        //*******************************************************************
        //私有屬性,只要不定義到test對象中,則是私有的,外界沒法訪問、子類沒法繼承
        //*******************************************************************
        var p = 0;   //私有屬性
        test.getp = function(){return p;}; //爲外界提供訪問私有屬性的接口
        //******************************************************************* 
        //test.setSex = function(x){Tom.sex = x;};
        //test.getSex = function(){return Tom.sex;};
        //*******************************************************************
        return test;
    },
    sex: "man"      //靜態屬性,至關於static
}
//使用
var hehe = Tom.creat();
hehe.fun();   //訪問類中的方法
alert(hehe.p);  //錯誤,私有屬性不能直接訪問,須要經過hehe.getp()訪問

//*****************************************************
//繼承,如如今有個TomSon的類要繼承Tom這個類,以下(私有屬性不可繼承,若有父類留有外部訪問接口,好比上面的getp()則能夠經過getp()訪問)
//*****************************************************
var TomSon {
    creat: function(){
        var test = Tom.creat();  //把Tom類實例化到TomSon中,而後本身再擴展。
        test.age = 18;           //TomSon本身擴展的屬性
        return test;
    }
}
//使用
var haha = TomSon.creat();
haha.fun();       //父類的方法
alert(haha.age);  //子類的屬性

//*******************************************************************
//static靜態,在構造函數外定義,把接口留在構造函數內便可。
//*******************************************************************
//使用,以Tom類爲例,建立兩個實例
 var tom1 = Tom.creat();
 var tom2 = Tom.creat();
 alert(tom1.getSex());    //man
 alert(tom2.getSex());   //man
 tom1.SetSex("women");
 alert(tom1.getSex());    //women
 alert(tom2.getSex());   //women
 //發現,改了tom1的sex以後,tom2也跟着變,因此sex是static的。
 alert(Tom.sex);        //直接用類名也能夠訪問static屬性
相關文章
相關標籤/搜索