JavaScript中的普通函數(shù)與構(gòu)造函數(shù)比較
問題
什么是構(gòu)造函數(shù)?
構(gòu)造函數(shù)與普通函數(shù)區(qū)別是什么?
用new關(guān)鍵字的時(shí)候到底做了什么?
構(gòu)造函數(shù)有返回值怎么辦?
構(gòu)造函數(shù)能當(dāng)普通函數(shù)調(diào)用嗎?
以下是我的一些理解,理解錯(cuò)誤的地方懇請(qǐng)大家?guī)兔χ刚x謝!
this
this永遠(yuǎn)指向當(dāng)前正在被執(zhí)行的函數(shù)或方法的owner。例如:
function test(){ console.log(this); } test(); //Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
上面這段代碼中,我們?cè)陧撁嬷卸x了一個(gè)test()函數(shù),然后在頁面中調(diào)用。函數(shù)定義在全局時(shí),其owner就是當(dāng)前頁面,也就是window對(duì)象。
this指向的幾種情況
1.全局中調(diào)用
this.name //this指向window對(duì)象
2.函數(shù)調(diào)用
test();//test()函數(shù)中的this也指向window對(duì)象
3.對(duì)象的方法調(diào)用
obj1.fn();//obj1對(duì)象的fn()方法中的this指向obj1
4.調(diào)用構(gòu)造函數(shù)
var dog=new Dog();//構(gòu)造函數(shù)內(nèi)的this指向新創(chuàng)建的實(shí)例對(duì)象,也就是這里的dogcall和apply
call和apply的作用一樣,只是接受參數(shù)的方式不一樣,call接受的是多個(gè)單個(gè)參數(shù),apply接受的是參數(shù)數(shù)組。
call和apply的作用簡(jiǎn)單地可以說成,當(dāng)一個(gè)對(duì)象實(shí)例缺少一個(gè)函數(shù)/方法時(shí),可以調(diào)用其他對(duì)象的現(xiàn)成函數(shù)/方法,其方式是通過替換其中的this為這個(gè)對(duì)象實(shí)例,改變函數(shù)運(yùn)行時(shí)的上下文。
例如:
function Dog(){ this.sound="汪汪汪"; } Dog.prototype.bark=function(){ alert(this.sound); }
現(xiàn)在我有另外一個(gè)cat對(duì)象:
var cat={sound:'喵喵喵'}
我也想讓這個(gè)cat對(duì)象可以調(diào)用bark方法,這時(shí)候就不用重新為它定義bark方法了,可以用call/apply調(diào)用Dog類的bark方法:
Dog.prototype.bark.call(cat);
或者:
dog.bark.call(cat);
加點(diǎn)東西,變成一個(gè)帶參數(shù)的栗子:
function Dog(){ this.sound="汪汪汪"; } Dog.prototype.bark=function(words){ alert(this.sound+" "+words); } var dog=new Dog(); dog.bark("有小偷");//alert:汪汪汪 有小偷 Dog.prototype.bark.call(cat,"餓了");//alert:喵喵喵 餓了
普通函數(shù)
這是一個(gè)簡(jiǎn)單的普通函數(shù):
function fn(){ alert("hello sheila"); } fn();//alert:hello sheila
普通函數(shù)與構(gòu)造函數(shù)相比有四個(gè)明顯特點(diǎn):
1.不需要用new關(guān)鍵字調(diào)用
fn();2.可以用return語句返回值
function fn(a,b){ return a+b; } alert(fn(2,3));//alert:5
3.函數(shù)內(nèi)部不建議使用this關(guān)鍵字
我們說不建議使用,當(dāng)然硬要用是可以的,只是要注意這時(shí)候發(fā)生了什么。如果在普通函數(shù)內(nèi)部使用this關(guān)鍵字定義變量或函數(shù),因?yàn)檫@時(shí)候this指向的是window全局對(duì)象,這樣無意間就會(huì)為window添加了一些全局變量或函數(shù)。
function greeting(){ this.name="sheila"; alert("hello "+this.name); } greeting();//alert:hello sheila alert(window.name);//alert:sheila
4.函數(shù)命名以駝峰方式,首字母小寫
構(gòu)造函數(shù)
在JavaScript中,用new關(guān)鍵字來調(diào)用定義的構(gòu)造函數(shù)。默認(rèn)返回的是一個(gè)新對(duì)象,這個(gè)新對(duì)象具有構(gòu)造函數(shù)定義的變量和函數(shù)/方法。
舉個(gè)栗子:
function Prince(name,age){ this.gender="male"; this.kind=true; this.rich=true; this.name=name; this.age=age; } Prince.prototype.toFrog=function(){ console.log("Prince "+this.name+" turned into a frog."); } var prince=new Prince("charming",25); prince.toFrog();//Prince charming turned into a frog. prince.kind;//true
與普通函數(shù)相比,構(gòu)造函數(shù)有以下明顯特點(diǎn):
1.用new關(guān)鍵字調(diào)用
var prince=new Prince("charming",25);
2.函數(shù)內(nèi)部可以使用this關(guān)鍵字
在構(gòu)造函數(shù)內(nèi)部,this指向的是構(gòu)造出的新對(duì)象。用this定義的變量或函數(shù)/方法,就是實(shí)例變量或?qū)嵗瘮?shù)/方法。需要用實(shí)例才能訪問到,不能用類型名訪問。
prince.age;//25
Prince.age;//undefined
3.默認(rèn)不用return返回值
構(gòu)造函數(shù)是不需要用return顯式返回值的,默認(rèn)會(huì)返回this,也就是新的實(shí)例對(duì)象。當(dāng)然,也可以用return語句,返回值會(huì)根據(jù)return值的類型而有所不同,細(xì)節(jié)將在下文介紹。
4.函數(shù)命名建議首字母大寫,與普通函數(shù)區(qū)分開。
不是命名規(guī)范中的,但是建議這么寫。
使用new關(guān)鍵字實(shí)例化的時(shí)候發(fā)生了什么?
以上文中的Prince()函數(shù)舉個(gè)栗子:
1.第一步,創(chuàng)建一個(gè)空對(duì)象。
var prince={}
2.第二步,將構(gòu)造函數(shù)Prince()中的this指向新創(chuàng)建的對(duì)象prince。
3.第三步,將prince的_proto_屬性指向Prince函數(shù)的prototype,創(chuàng)建對(duì)象和原型間關(guān)系
4.第四步,執(zhí)行構(gòu)造函數(shù)Prince()內(nèi)的代碼。
構(gòu)造函數(shù)有return值怎么辦?
構(gòu)造函數(shù)里沒有顯式調(diào)用return時(shí),默認(rèn)是返回this對(duì)象,也就是新創(chuàng)建的實(shí)例對(duì)象。
當(dāng)構(gòu)造函數(shù)里調(diào)用return時(shí),分兩種情況:
1.return的是五種簡(jiǎn)單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined。
這種情況下,忽視r(shí)eturn值,依然返回this對(duì)象。
2.return的是Object
這種情況下,不再返回this對(duì)象,而是返回return語句的返回值。
function Person(name){ this.name=name; return {name:"cherry"} } var person=new Person("sheila"); person.name;//cherry p;//Object {name: "cherry"}
- 深入理解JavaScript中的箭頭函數(shù)
- JavaScript中的普通函數(shù)和箭頭函數(shù)的區(qū)別和用法詳解
- Javascript中 帶名 匿名 箭頭函數(shù)的重要區(qū)別(推薦)
- 深入理解Javascript箭頭函數(shù)中的this
- javascript ES6中箭頭函數(shù)注意細(xì)節(jié)小結(jié)
- JavaScript箭頭函數(shù)中的this詳解
- 詳解Javascript ES6中的箭頭函數(shù)(Arrow Functions)
- Javascript 普通函數(shù)和構(gòu)造函數(shù)的區(qū)別
- JavaScript中箭頭函數(shù)與普通函數(shù)的區(qū)別詳解
相關(guān)文章
認(rèn)識(shí)延遲時(shí)間為0的setTimeout
由 John Resig 的 How JavaScript Timers Work 可以知道,現(xiàn)有的 JavaScript 引擎是單線程處理任務(wù)的。它把任務(wù)放到隊(duì)列中,不會(huì)同步去執(zhí)行,必須在完成一個(gè)任務(wù)后才開始另外一個(gè)任務(wù)。2008-05-05微信小程序?qū)崿F(xiàn)簡(jiǎn)單手寫簽名組件的方法實(shí)例
在使用微信的時(shí)候,為方便我們發(fā)送文件可以直接在上面進(jìn)行手寫簽名,這篇文章主要給大家介紹了關(guān)于利用微信小程序?qū)崿F(xiàn)簡(jiǎn)單手寫簽名組件的相關(guān)資料,需要的朋友可以參考下2021-07-07js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)
本文主要介紹了js實(shí)現(xiàn)圖片360度旋轉(zhuǎn)的思路與方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01JS過濾url參數(shù)特殊字符的實(shí)現(xiàn)方法
本篇文章主要是對(duì)JS過濾url參數(shù)特殊字符的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12js 復(fù)制或插入Html的實(shí)現(xiàn)方法小結(jié)
很多情況下是用innerHTML或innerText,現(xiàn)在比較流行直接的dom操作,大家可以根據(jù)需要選擇。2010-05-05JS表單提交驗(yàn)證、input(type=number) 去三角 刷新驗(yàn)證碼
在進(jìn)行表單提交時(shí),需要對(duì)輸入框和文本域等的value的合理性進(jìn)行驗(yàn)證,可以編寫form的onSubmit事件,下面給大家介紹js表單提交驗(yàn)證input(type=number) 去三角 刷新驗(yàn)證碼注意事項(xiàng),一起看看吧2017-06-06javascript 小數(shù)乘法結(jié)果錯(cuò)誤的處理方法
下面小編就為大家?guī)硪黄猨avascript 小數(shù)乘法結(jié)果錯(cuò)誤的處理方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07javascript正則表達(dá)配置擴(kuò)展名并實(shí)現(xiàn)驗(yàn)證
這篇文章主要介紹了javascript正則表達(dá)配置擴(kuò)展名并實(shí)現(xiàn)驗(yàn)證,文章圍繞主題展開相關(guān)資料,具有以得參考價(jià)值,需要的小伙伴可以參考一下2022-02-02