ES5中的類

之前小編對於類和類的基本特徵(所謂的封裝、繼承、多態)理解一直不是很到位,同時在實際項目應用中也用的比較少,今天小編就結合ES5中的基本用法和大家聊聊,希望小夥伴會在這篇文章有屬於自己的收穫,並能夠在今後的項目中有實際應用。大家還可以關注我的微信公眾號,蝸牛全棧。
一、類的基本用法

function People(name,age){
    // this指向的是People{}
    this.name = name
    this.age = age
}

let p1 = new People("lilei",30)
console.log(p1) // People{name:"lilei",age:34}

let p2 = new People("hanmei",18)
console.log(p2) // People{name:"hanmei",age:18}

二、類的方法:該實例中會有一些資源浪費,因為在每一個實例化的時候,在類中都會存在該方法,實際中為了節約資源,會將類方法定義在原型上

function People(name,age){
    // this指向的是People{}
    this.name = name
    this.age = age
    this.showName = function(){
        console.log("當前人的名字是:"+this.name)
    }
}

let p1 = new People("lilei",30)
console.log(p1) // People{name:"lilei",age:34}
p1.showName() // 當前人的名字是:lilei

let p2 = new People("hanmei",18)
console.log(p2) // People{name:"hanmei",age:18}
p2.showName() // 當前人的名字是:hanmei

三、實際類方法創建實例

function People(name,age){
    this.name = name
    this.age = age
}
People.prototype.showName = function(){
    console.log(this.name)
}
let p1 = new People("lilei",30)
console.log(p1) // People{name:"lilei",age:34}
p1.showName() // lilei

let p2 = new People("hanmei",18)
console.log(p2) // People{name:"hanmei",age:18}
p2.showName() // hanmei

四、類的靜態屬性和靜態方法:上述的例如name和age屬性,都是實例化之後才有的屬性和方法,上述屬性和方法一般稱為實例屬性和實例方法,需要類實例化之後才可以處理的屬性,實例方法需要把類實例化之後才能調用。靜態屬性和靜態方法可以通過類直接調用,不必實例化。類的靜態屬性

function People(name,age){
    // this指向的是People{}
    this.name = name // 實例屬性
    this.age = age // 實例屬性
}
People.count = 10
console.log(People.count) // 10

類的靜態方法

function People(name,age){
    // this指向的是People{}
    this.name = name // 實例屬性
    this.age = age // 實例屬性
}
People.getCount = function(){
    console.log("當前數字為"+People.count)
}
console.log(People.count) // 10

五、類的繼承
1、構造函數繼承:只能繼承父類的屬性,不能繼承父類的方法

// 父類
function Animal(name){
    this.name = name
}

Animal.prototype.showName = function(){
    console.log("名字是:"+this.name)
}

// 子類
function Dog(name,color){
    Animal.call(this,name) // 繼承屬性
    this.color = color
}

let d1 = new Dog("wangcai","white")
console.log(d1) // Dog{name:"wangcai",color:"white"}
d1.showName() // 報錯:d1.showName is not a function // 構造函數繼承只能繼承父類的屬性,不能繼承父類的方法

2、原型繼承:只能繼承父類方法,不能繼承父類屬性

// 父類
function Animal(name){
    this.name = name
}

Animal.prototype.showName = function(){
    console.log("名字是:"+this.name)
}

// 子類
function Dog(name,color){
    // Animal.call(this,name) // 繼承屬性
    this.color = color
}
Dog.prototype = new Animal()
Dog.prototype.constuctor = Dog

let d1 = new Dog("wangcai","white")
console.log(d1) // Dog{name:"wangcai",color:"white"}
d1.showName() // undefind