JavaScript面向對象編程(OOP)

1:基本概念

面向對象編程是用抽象方式建立基於現實世界模型的一種編程模式。編程

這句話的意思是:每一個對象可以接受信息,處理數據和發送消息給其餘對象;這就意味着在這個編程模式下,每個對象都是一個獨立的個體,它能夠接收,能夠處理,而後再把消息發送出去。每一個對象均可以被看做是一個擁有清晰角色或責任的獨立個體。app

使用面向對象編程是爲了促進更好的靈活性和可維護性。函數

面向對象的重要知識點:this

  • Namespace命名空間spa

  • Class 類(定義對象的屬性和方法)prototype

  • Object 對象(類的一個實例)code

  • Property 屬性(對象的特徵)對象

  • Method 方法(對象的能力)繼承

  • Constructor 構造函數(對象初始化的瞬間被調用的方法)接口

  • Inheritance 繼承(繼承另外一個類的特徵)

  • Encapsulation 封裝(把數據和相關的方法綁定在一塊兒使用)

  • Polymorphism多態(不一樣類能夠定義相同的方法或屬性)。

面向對象與面向過程比較,面向過程更注重過程。

2:Namespace 命名空間

命名空間只是另外一個包含方法、屬性和對象的對象。在js中要有獨立的命名空間,首先須要建立全局變量,不一樣的全局變量用於區分不一樣的命名空間。由於js最頂層只有一個全局的命名空間,而後在全局變量上面增長一些變量、方法和功能,這些就是這個對象的屬性。

  • 命名空間是一個包含方法,屬性和對象的對象
    var myNameScape = myNameScape || {};
    
      // 子命名空間 
      myNameScape.event = {};
    
      // 定義方法和屬性 
      myNameScape.commonMethods = {
          name: '',
          validateName: function(name){
              // name格式驗證 
          },
      };
    
      // 定義方法 
      myNameScape.event = {
          addListener: function(el, type, fn) {
              // ... 
          },
          removeListener: function(el, type, fn) {
              // ...
          },
      }
  • 內置對象 常見的內置對象:Math、Array、Object

3:Class 類(構造函數)

由於JavaScript是一種基於原型的語言,因此沒有類聲明語句。所以這個類就是構造函數。

它是用方法做類,好比:

function Person(){
        
    }
    
    var Person = function(){
    
    }

或者當咱們要把Person實例化時,咱們須要從新new Person,而後咱們就獲得了Object也就是對象。

4:Object 對象(類的實例)

function Person(){
        
    }
    var person1 = new Person();
    var person2 = new Person();

5:構造器(Constructor)

構造器是對象中的一個方法,每次實例化都會被調用;JavaScript中函數能夠做爲構造器使用;每一個聲明的函數均可以在實例化後被調用執行。

function Person(){
       console.cog('Person created!');
    }
    var person1 = new Person();
    var person2 = new Person();

6:Property 屬性

類中包含的變量。

function Person(firstName) {
        this.firstName = firstName;
        console.log('Person created!');
    }
    
    var person1 = new Person('Alice');
    var person2 = new Person('Bob');

7:Method 方法

方法與屬性類似;方法是函數,屬性能夠被定義爲函數。

function Person(firstName) {
        this.firstName = firstName;
    }
    Person.prototype.sayHello = function(){
        console.log("Hello,I'm" + this.firstName);
    };
    
    var person1 = new Person('Alice');
    var person2 = new Person('Bob');

8:Inheritance 繼承

繼承:子類可使用父類的全部功能,而且對這些功能進行擴展。繼承的過程,就是從通常到特殊的過程。

繼承本質上一個是原型鏈繼承,一個是構造函數繼承,在此以後也衍生出不少,通常來說,最好的方法就是第三種繼承:混合繼承。藉助原型鏈和構造函數繼承來達到一個較完善的效果。

9:Encapsulation 封裝(把數據和相關的方法綁定在一塊兒使用)

封裝:把客觀事物封裝成抽象的類,隱藏屬性和方法的實現細節,僅對外公開接口。

function Person(name, age, sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    Person.prototype.show = function (){
        console.log(this.name + ' ' + this.sex + ' ' + this.age);
    }
    var person = new Person('Eric', 18, '男');

10:Polymorphism 多態

多態就是經過對傳遞的參數判斷來執行邏輯,便可實現一種多態處理機制。

多態其實是同一操做做用於不一樣的對象, 能夠有不一樣的解釋, 產生不一樣的執行結果。

多態最根本的做用就是經過把過程化的條件語句轉化爲對象的多態性,從而消除這些條件分支語句。

function Person(name, age){
        this.name = name;
        this.age = age;
    }
    
    Person.prototype.toString = function() {
        return "I am a Person, my name is " + this.name;
    }
    
    function Man(name, age){
        Person.apply(this, arguments);
    }
    
    Man.prototype = Object.create(Person.prototype);
    
    Man.prototype.toString = function() {
        return "I am a Man, my name is"+this.name;
    }
    
    var person = new Person("Neo", 19);
    var man1 = new Man("Davin", 18);
    var man2 = new Man("Jack", 19);
相關文章
相關標籤/搜索