js面向對象及面向對象的三大特性


一:js面向對象編程

在es5中我們是這樣去寫面向對象的編程方式的:

function Person(name) {
     //構造函數里面的方法和屬性
    this._name = name;
    this.getName = function () {
         console.log(this._name);
     };
     this.setName = function (name) {
         this._name = name;
     };
 }
 
 let p = new Person("張三");
 p.getName();  // 張三
 p.setName("李四");
 p.getName();  // 李四

在es6中,提供了新的方式去書寫面向對象編程,這種方式更加接近面向對象的書寫方式,但本身只是一種語法糖:

// 定義類
class
Person { //類的構造函數,實例化的時候執行,new的時候執行 constructor(name) { this._name = name; } getName() { console.log(this._name); } setName(name) { this._name = name } }
let p = new Preson('張三') p.getName();
// 張三 p.setName('李四'); p.getName(); // 李四

 二:面向對象的三大特征

三大特征分別為:封裝,繼承和多態

1:封裝

我們平時所用的方法和類都是一種封裝,當我們在項目開發中,遇到一段功能的代碼在好多地方重復使用的時候,我們可以把他單獨封裝成一個功能的方法,這樣在我們需要使用的地方直接調用就可以了。

2:繼承

繼承在我們的項目開發中主要使用為子類繼承父類,下面是es6繼承的書寫方法

 
         
class Father {
   constructor(name) {
         this._name = name;
     }
   //實例方法,通過實例對象調用
getName() { console.log(this._name); }
   // 靜態方法不會被繼承,並且是通過類名去調用的
   static hitXiaoMing() {
         console.log("打小明")  }
 }
 
 class Son extends Father {
     constructor(name, age) {
         //實例化子類的時候把子類的數據傳給父類(這里的super必須有,super里的參數是所繼承的父類實例化所需要的數據)
         super(name);
         this._age = age;
     } }
 
 var DaMing = new Father('大明');
 Father.hitXiaoMing(); //打小明
DaMing.getName(); //大明

 var XiaoMing = new Son('小明',15);
 
         
 XiaoMing.getName(); //小明
 
        

特別提醒:繼承會繼承父類的實例屬性和實例方法,並不會繼承靜態屬性和靜態方法,並且靜態方法只能通過類名去調用。

三:多態

 多態的具體表現為方法重載和方法重寫:

方法重載:重載是指不同的函數使用相同的函數名,但是函數的參數個數或類型不同。調用的時候根據函數的參數來區別不同的函數

方法重寫:重寫(也叫覆蓋)是指在派生類中重新對基類中的虛函數(注意是虛函數)重新實現。即函數名和參數都一樣,只是函數的實現體不一樣

下面我們根據上面的例子在添加一個work的方法說明一下方法重寫:

class Father {
   constructor(name) {
         this._name = name;
     }
   //實例方法,通過實例對象調用
     getName() {
         console.log(this._name);
     }
work() {
  console.log('我的工作是累死累活,賺錢養家')
}    
// 靜態方法不會被繼承,並且是通過類名去調用的    static hitXiaoMing() { console.log("打小明") } } class Son extends Father { constructor(name, age) { //實例化子類的時候把子類的數據傳給父類(這里的super必須有,super里的參數是所繼承的父類實例化所需要的數據) super(name); this._age = age; }
     work() {
  console.log('我的工作是好好學習,天天向上。')
}
}
 
 var DaMing = new Father('大明');
 DaMing.work() // 我的工作是累死累活,賺錢養家。
 var XiaoMing = new Son('小明'15); 
XiaoMing.work(); // 我的工作是好好學習,天天向上。

以上我們重寫了父類的work()方法。

 

三大特征的優點:

封裝:封裝的優勢在於定義只可以在類內部進行對屬性的操作,外部無法對這些屬性指手畫腳,要想修改,也只能通過你定義的封裝方法;

繼承:繼承減少了代碼的冗余,省略了很多重復代碼,開發者可以從父類底層定義所有子類必須有的屬性和方法,以達到耦合的目的;

多態:多態實現了方法的個性化,不同的子類根據具體狀況可以實現不同的方法,光有父類定義的方法不夠靈活,遇見特殊狀況就捉襟見肘了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM