一直以來,對于建構式這一塊的知識仍然不是很精通,只是大致知道有這個知識點,在花了一段時間學習以后,想著把這些知識和心得歸納總結一下,以下是相關知識點的總結:
什么是建構式?
可能有的人看到建構式之后,就開始有些緊張了,覺得這種知識一定是很深奧的,但是,如果真的認真學習一下,其實會發現,這個知識點也沒有想象中的那么難,建構式本質上其實就是一個普通函式,也就是說你隨便寫一個函式,就可以當作建構式來使用,不過,規矩不能忘,建構式怎么說也不能和普通函式顯得一模一樣,為了區分,我們往往對于建構式命名的時候,選擇將首字母大寫,如下:
function person(){
console.log('HelloWorld!')
}
function Person(){
console.log('HelloWorld!')
}
從函式命名層面而言,第二個顯然更適合做建構式,這個就好比有的引數命名就應該使用駝峰命名法一樣,沒有任何一條規則規定你必須這么寫,但這就是約定俗成的寫法,
怎么來使用建構式?
首先我們需要知道的一點是,呼叫函式其實是有三種方式的,只是因為我們在使用程序中往往使用的是前兩種方式,從而導致忽略了第三種呼叫方式,具體的三種方式如下:
1.宣告式函式,如:
function speak(){
console.log("你好呀!")
}
speak();
2.命名式函式,如:
var speak = function(){
console.log("你好呀!")
}
speak();
3.使用新建物件后再呼叫
var Speak = function(){
console.log("你好呀!")
}
var speak = new Speak();
this.speak; //呼叫這個物件,在控制臺就會輸出“你好呀!”
一般來說,第三種方式是不是很像我們新建一個物件,比如平常新建一個Object物件的寫法如下:
var person = new Object();
上面這種寫法是不是看著就很親切,但是在控制臺輸入如下的指令,就會發現任何你新建的物件,其實都是繼承了Object的原型
function Speak(){
console.log("你好呀!")
}
var speak = new Speak();
console.log(speak instanceof Speak)
console.log(speak instanceof Object)
console.log(Speak instanceof Object)

這里有一個知識點:typeof 只能用于判斷基礎型別,但是Array和Object這兩種參考型別,都會判斷為object型別,如下:

如果我們想要進一步判斷當前這個物件究竟是object型別還是array型別,就需要使用instanceof方法,因為陣列也是一種物件,只是其底層的儲存方式不一樣,陣列是使用物理地址連續的記憶體空間進行存盤,而物件則是一大塊的記憶體空間,想深入了解的小伙伴建議可以看看底層實作

建構式能起到什么作用?
建構式的作用能夠讓我們創建一個物件的原型,并通過形參的注入實作個性化的設定,方便對有需求的物件統一管理
建構式的執行流程:
1.立刻創建一個新的物件(開辟一個記憶體空間用于存盤當前這個物件,這里設計到GC回識訓制,新生代、老生代之類的)
2.將新建的物件設定為函式中的this,在建構式中可以通過this來參考新建的物件(所以說,新建物件是會改變this的參考)
3.逐行執行函式中的代碼
4.將新建的物件作為回傳值回傳(這個很重要,因為我們在平常的函式中,如果函式不顯示的呼叫return是默認回傳undefined,而新建物件時,return默認回傳的時當前物件)
那么我們一般是怎么使用建構式來新建物件的呢?這里呢,我們可以運用哲學的思維:抓主要矛盾,抓矛盾的主要方面,比如我現在需要創建一些動物的物件,比如貓、狗,在數量少的時候,我們可以這么寫:
var Dog = {
name:'狗',
age: 1,
say: '旺旺'
}
var Cat = {
name: '貓',
age: 2,
say: '喵'
}
但是,如果現在新增了很多的狗和貓,比如二哈、薩摩耶、二狗子、波斯貓、藍貓等,而且它們的年齡各不相同,關鍵是建國之后雖然不準成精,但是有的狗卻可以口吐方芬,不講武德,而有的貓貓呢,因為想吃魚,說出了“給我魚”這樣的話,那么,顯然,你需要把各種貓貓狗狗的名字、年齡、說的話都一個個記錄下來,然后湊成物件,這樣確實是太耗費時間了,還浪費記憶體,耽誤青春,影響我們起飛,但是如果我們能創建建構式,像下面這樣:
function Dog(name,age,say){
this.name = name,
this.age = age,
this.say = say,
console.log("這是:" + this.name + ",它今年:" + this.age + "歲了,它會說" + this.say)
}
var twoHa = new Dog('二哈',1,'老子是二哈,拆家不用夸!');
this.twoHa;

如上所述,我們不但能通過直接輸入形參來構建我們所需的特殊需求(畢竟名字,年齡之類的都是一個動態變化的數值,如果像一開始那樣寫死了,真的很麻煩),而且還能根據我們的需求在其中加入各種函式和輸出等,讓我們瞬間一目了然!
再來談談ES6中的Class
只要學習了ES6的小伙伴都知道(如果目前還未接觸的話,請看我的ES6相關知識),ES6中新增了一個知識點Class,這個知識點其實只是建構式的一個語法糖而已,也就是說,Class的本質其實就是建構式,只是為了讓我們更方便的使用建構式而已,class的繼承extends本質上其實就是對建構式原型鏈的繼承,根據上面的例子,用class的寫法如下:
class Dog{ //定義一個名字為Dog類,因為以前學過JAVA,看到這樣的寫法就很親切
constructor(name,age,say){ //constructor為一個構造方法,用于new物件時傳入特定引數
this.name = name,
this.age = age,
this.say = say
}
speak(){ //在class中,不需要使用function來定義函式,一定要注意方法名稱不要和屬性名稱一樣,不然會報錯
return "這是:" + this.name + ",它今年:" + this.age + "歲了,它會說" + this.say
}
}
var twoHa = new Dog('二哈',1,'老子是二哈,拆家不用夸!');
console.log(twoHa.speak())

因此說,建構式其實也是很有意思的,其實每個知識點都很有意思,主要是我們是不是用有意思的方法來打開這些有意思的知識點,讓我們做一個有意思的人,過著有意思的人生吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/229878.html
標籤:其他
下一篇:JS特效二:圖片彈窗
