①抽象java
js提供如下幾種控制方法和屬性的訪問權限:函數
(1)公開級別:對外公開學習
(2)私有級別:類自己能夠訪問,不對外公開this
案例以下所示:spa
function Person(name,age,sal){ this.name=name;//公開的屬性 var age=age;//私有屬性 var salary=sal;//私有屬性 //在類中如何定義公開方法(特權方法),私有方法(內部方法) //若是咱們但願操做私有的屬性,則可以使用公開方法實現 this.show=function(){ window.alert(age+" "+salary); } show2=function(){ window.alert(age+" "+salary); } } var p1=new Person("sp",20,50000); window.alert(p1.name+" "+p1.age); p1.show(); //p1.show2();//報錯,由於show2是私有方法。
輸出:sp undefinedprototype
20 50000code
☞咱們前面學習過,經過prototype給全部的對象添加方法,可是這種方式不能去訪問類的私有變量和方法。對象
function Person(){ this.name="abc"; var age=90; this.abc=function(){ window.alert("abc"); } abc2=function(){ window.alert("abc"); } } Person.prototype.fun1=function(){ window.alert(this.name); //window.alert(age);//這會報錯,由於prototype添加的方法不能訪問類的私有屬性和方法。 this.abc();//必須用this.abc(),若是用abc()會報錯 //this.abc2();//報錯,可是若是直接用abc2()又沒有出問題 } var p=new Person(); p.fun1();
②繼承blog
(1)爲何須要繼承?防止代碼冗餘,方便代碼的管理繼承
/*function MidStu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } //計算學費 this.payFee=function(money){ window.alert("應繳"+money*0.8); } } function Pupil(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } this.payFee=function(){ window.alert("應繳"+money*0.5); } } */ //解決解決代碼冗餘-->繼承 //抽象出一個學生類,(即把中學生和小學生的共性提取出來) function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu; this.stu(name,age);//js中其實是經過對象冒充,來實現繼承,這句話不能少 } function Pupil(name,age){ this.stu=Stu; this.stu(name,age); } var midStu=new MidStu("順平",20); midStu.show();
this.stu=Stu;後的this.stu(name,age)這句話是不能少的。
//抽象出一個學生類,(即把中學生和小學生的共性提取出來) function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu;//至關於把函數賦值給stu,賦值之後,必定要執行stu //this.stu(name,age);//js中其實是經過對象冒充,來實現繼承,這句話不能少
//由於js是動態語言,若是不執行該語句,則不能實現繼承效果。
} function Pupil(name,age){ this.stu=Stu; this.stu(name,age); } var midStu=new MidStu("順平",20); window.alert(midStu.name);//沒有this.stu(name,age);這句話,打印出undefined //midStu.show();//沒有this.stu(name,age);這句話會報錯,沒有執行Stu函數
js能夠不能夠繼承
沒有extends關鍵字,可是能夠經過對象冒充的方式實現繼承,並且是多重繼承。
特別說明:經過對象冒充,js能夠實現多重繼承的效果。
js不支持重載,可是函數的調用又和參數類型和參數個數是沒有關係(其實也是另外一種形式的重載,只是否是經過函數名來實現的)。
js的重載和重寫
重載:js中不支持重載(即,不能夠經過參數的個數 來決定調用哪一個函數,可是由於js天熱支持可變參數,因此,能夠看作天熱支持重載)。
結論:js只是不能夠寫幾個同名函數(會被最後一個覆蓋),可是由於函數調用時和參數沒有關係,因此它具備函數重載所實現的功能。
重寫:子類能夠從新寫函數,來覆蓋父類的某個方法。
function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu; this.stu(name,age);//js中其實是經過對象冒充,來實現繼承,這句話不能少 //MidStu能夠覆蓋Stu父類的show this.show=function(){ window.alert("MidStu show()"); } }
var midStu=new MidStu("順平",20);
midStu.show();
重寫,覆蓋父類的方法。
③多態
所謂多態,就是指一個引用(類型)在不一樣狀況下的多種狀態。在java中多態是指經過指向父類的引用,來調用在不一樣子類中實現的方法。
js其實是無態的,是一種動態語言,一個變量的類型是在運行的過程當中由js引擎來決定的,因此說js天生就支持多態。
②封裝