js面向(基於)對象編程-三大特徵

①抽象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天生就支持多態。

 

 

 

 

 

 

②封裝

相關文章
相關標籤/搜索