淺析js的工廠函數、構造函數

首先,說下工廠函數。顧名思義,就比如一個工廠同樣,能夠批量製造某種類型的東西。其實說白了就是封裝了個方法減小重複工做,相信稍微有點碼齡的人都懂。上代碼:函數

function animal (name,sex) {
        let obj = new Object()
        obj.name = name
        obj.sex = sex
        obj.saySex = function () {
            alert(`個人性別是${this.sex}`)
        }
        return obj
    }
    let monkey = animal('猴子','母')
    console.log(monkey.name)    //猴子
    monkey.saySex()             //個人性別是母

這樣寫主要是爲了解決須要建立大量有屬性重疊的對象,若是每一個都new一下,而後逐一添加屬性。這也是個累人的活。經過上面的代碼中,咱們聲明瞭一個animal方法,此方法可批量製造動物。這樣每次只須要簡單的一行代碼就能夠搞定一個動物的建立。this

方便雖然方便,可是仍是有缺點。就是每次新建的時候都須要在內部建立一個對象,而後進行一系列操做,最後返回。也就是說建立十次,那麼就會建立十次全新的對象,而後返回並賦值。這樣建立的十個對象在代碼間的關係是沒有的,換句話說就是咱們都產自動物,可是誰都不知道咱們咱們產自哪裏。code

應對某些場景,工廠函數並不能知足咱們,如:我須要判斷樹是否是動物類型,你會發現你並沒辦法。只能知道他是Object。這時候構造函數就出現了:對象

function animal (name,sex) {
        this.name = name
        this.sex = sex
        this.saySex = function () {
            alert(`個人性別是${this.sex}`)
        }
    }
    let monkey = new animal('猴子','母')
    console.log(monkey.name)    //猴子
    monkey.saySex()             //個人性別是母

跟工廠函數很像,只是沒有了建立對象和return,而且都用this添加屬性。聲明新對象的時候經過new關鍵字。這樣作的好處是,新建的對象間是有關係的,咱們檢測下:io

console.log(monkey instanceof animal)     //true
console.log(monkey instanceof Object)     //true

咱們能夠看到,他的類型既是animal也是Object。就比如你是你爸爸的後代,但同時也是你爺爺的後代。console

相關文章
相關標籤/搜索