最近在學(xué)習(xí)React框架瘫拣,雖然學(xué)完之后,掌握了React的語法告喊,但是我在學(xué)習(xí)過程中發(fā)現(xiàn)麸拄,例如我利用React創(chuàng)建組件的時候發(fā)現(xiàn)我原生JavaScript亦或者是ES語法都掌握的十分不熟練,我之前掌握的知識體系就像個??黔姜,我之前都太小瞧JS了...
從構(gòu)造函數(shù)開始
before write
為啥從構(gòu)造函數(shù)開始呢感帅?因為我樂意??,我希望我的讀者都是技術(shù)素養(yǎng)高的人類地淀,面向?qū)ο缶幊痰绕拍钚允颉⒗碚撔缘臇|東我就不說了,我記錄的都是備忘錄類的東東帮毁,以備朕的需要实苞。好了,朕不婆婆媽媽的啦烈疚。
啥是構(gòu)造函數(shù)
像典型的面向?qū)ο缶幊陶Z言如java,都有類的概念黔牵,而類里面有一個方法,叫構(gòu)造器爷肝,我們程序員就是通過這個構(gòu)造器并以類為模板來創(chuàng)建我們所需的對象猾浦,在JS中也有這樣的構(gòu)造器,我們叫他構(gòu)造函數(shù)
構(gòu)造函數(shù)長啥樣
構(gòu)造函數(shù)她也是函數(shù)灯抛,其實很簡單金赦,長這樣
function Student(name){
this.name = name;
}
還有函數(shù)表達(dá)式樣式的
let Car = function(wl_count){
this.wheel = wl_count;
}
規(guī)則:為了和普通函數(shù)區(qū)別,構(gòu)造函數(shù)的函數(shù)名都要大寫对嚼,而函數(shù)體內(nèi)的this.啥啥啥的是在實例化對象的時候初始化對象屬性的夹抗。之后會寫專門介紹this
的文章。
如何通過構(gòu)造函數(shù)創(chuàng)建實例對象
我們通過new
關(guān)鍵字創(chuàng)建對象
很簡單
let ssa = new Student("imikasa");
let benCi = new Car(6);
值得注意的一些事情
因為構(gòu)造函數(shù)也是函數(shù)吧纵竖,所以肯定會有熊孩子像調(diào)用普通函數(shù)一樣調(diào)用構(gòu)造函數(shù)漠烧,那會發(fā)生什么事情呢杏愤?我們試試看唄
let obj = Student("tim"); //不用new調(diào)用構(gòu)造函數(shù)
console.log(obj); //undefined
console.log(name); //tim
我們發(fā)現(xiàn)全局中并沒有我想要的obj對象,但是對象中的name屬性值卻暴漏給了全局已脓,這樣實在是太糟糕了珊楼。
原因是我們直接調(diào)用了構(gòu)造函數(shù),而調(diào)用者是全局對象度液,因為我的運行js的環(huán)境是瀏覽器厕宗,所以是window調(diào)用的構(gòu)造函數(shù),進(jìn)入構(gòu)造函數(shù)體內(nèi)會為全局掛載這個name屬性恨诱,所以之后這個name就變成了全局變量了。
- 如何避免
這樣,函數(shù)內(nèi)添加嚴(yán)格模式
function Fubar(foo, bar){
'use strict';
this._foo = foo;
this._bar = bar;
}
Fubar()
// TypeError: Cannot set property '_foo' of undefined
或是這樣
function Fubar(foo, bar) {
if (!(this instanceof Fubar)) {
return new Fubar(foo, bar);
}
this._foo = foo;
this._bar = bar;
}
Fubar(1, 2)._foo // 1
(new Fubar(1, 2))._foo // 1