模擬面向對象的類
第一種方法: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屬性