国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中的普通函數(shù)與構(gòu)造函數(shù)比較

2019-11-20 12:44:29
字體:
供稿:網(wǎng)友

問題

什么是構(gòu)造函數(shù)?
構(gòu)造函數(shù)與普通函數(shù)區(qū)別是什么?
用new關(guān)鍵字的時候到底做了什么?
構(gòu)造函數(shù)有返回值怎么辦?
構(gòu)造函數(shù)能當普通函數(shù)調(diào)用嗎?

以下是我的一些理解,理解錯誤的地方懇請大家?guī)兔χ刚?,謝謝!

this
this永遠指向當前正在被執(zhí)行的函數(shù)或方法的owner。例如:

function test(){  console.log(this);}test();//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

上面這段代碼中,我們在頁面中定義了一個test()函數(shù),然后在頁面中調(diào)用。函數(shù)定義在全局時,其owner就是當前頁面,也就是window對象。

this指向的幾種情況

1.全局中調(diào)用

    this.name //this指向window對象
   
2.函數(shù)調(diào)用

    test();//test()函數(shù)中的this也指向window對象
   
3.對象的方法調(diào)用

    obj1.fn();//obj1對象的fn()方法中的this指向obj1
   
4.調(diào)用構(gòu)造函數(shù)
    var dog=new Dog();//構(gòu)造函數(shù)內(nèi)的this指向新創(chuàng)建的實例對象,也就是這里的dogcall和apply

call和apply的作用一樣,只是接受參數(shù)的方式不一樣,call接受的是多個單個參數(shù),apply接受的是參數(shù)數(shù)組。
call和apply的作用簡單地可以說成,當一個對象實例缺少一個函數(shù)/方法時,可以調(diào)用其他對象的現(xiàn)成函數(shù)/方法,其方式是通過替換其中的this為這個對象實例,改變函數(shù)運行時的上下文。
例如:

function Dog(){  this.sound="汪汪汪";}Dog.prototype.bark=function(){  alert(this.sound);}

現(xiàn)在我有另外一個cat對象:

var cat={sound:'喵喵喵'}

我也想讓這個cat對象可以調(diào)用bark方法,這時候就不用重新為它定義bark方法了,可以用call/apply調(diào)用Dog類的bark方法:

Dog.prototype.bark.call(cat);

或者:

dog.bark.call(cat);

加點東西,變成一個帶參數(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ù)
這是一個簡單的普通函數(shù):

function fn(){  alert("hello sheila");}fn();//alert:hello sheila

普通函數(shù)與構(gòu)造函數(shù)相比有四個明顯特點:

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)鍵字
我們說不建議使用,當然硬要用是可以的,只是要注意這時候發(fā)生了什么。如果在普通函數(shù)內(nèi)部使用this關(guān)鍵字定義變量或函數(shù),因為這時候this指向的是window全局對象,這樣無意間就會為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ù)。默認返回的是一個新對象,這個新對象具有構(gòu)造函數(shù)定義的變量和函數(shù)/方法。

舉個栗子:

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ù)有以下明顯特點:

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)造出的新對象。用this定義的變量或函數(shù)/方法,就是實例變量或?qū)嵗瘮?shù)/方法。需要用實例才能訪問到,不能用類型名訪問。

 prince.age;//25
    Prince.age;//undefined

3.默認不用return返回值
構(gòu)造函數(shù)是不需要用return顯式返回值的,默認會返回this,也就是新的實例對象。當然,也可以用return語句,返回值會根據(jù)return值的類型而有所不同,細節(jié)將在下文介紹。

4.函數(shù)命名建議首字母大寫,與普通函數(shù)區(qū)分開。
不是命名規(guī)范中的,但是建議這么寫。

使用new關(guān)鍵字實例化的時候發(fā)生了什么?
以上文中的Prince()函數(shù)舉個栗子:

1.第一步,創(chuàng)建一個空對象。

var prince={}

2.第二步,將構(gòu)造函數(shù)Prince()中的this指向新創(chuàng)建的對象prince。
3.第三步,將prince的_proto_屬性指向Prince函數(shù)的prototype,創(chuàng)建對象和原型間關(guān)系
4.第四步,執(zhí)行構(gòu)造函數(shù)Prince()內(nèi)的代碼。

構(gòu)造函數(shù)有return值怎么辦?
構(gòu)造函數(shù)里沒有顯式調(diào)用return時,默認是返回this對象,也就是新創(chuàng)建的實例對象。
當構(gòu)造函數(shù)里調(diào)用return時,分兩種情況:

1.return的是五種簡單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined。
這種情況下,忽視return值,依然返回this對象。

2.return的是Object
這種情況下,不再返回this對象,而是返回return語句的返回值。

function Person(name){    this.name=name;    return {name:"cherry"}  }  var person=new Person("sheila");  person.name;//cherry  p;//Object {name: "cherry"}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 哈巴河县| 五家渠市| 乳山市| 搜索| 汉川市| 大庆市| 咸宁市| 剑川县| 淳安县| 黑龙江省| 高台县| 留坝县| 鄂托克旗| 康马县| 青河县| 乌拉特中旗| 板桥市| 浦东新区| 江西省| 普兰店市| 凤城市| 星座| 靖远县| 临邑县| 罗山县| 福海县| 营山县| 台江县| 宁远县| 富源县| 南皮县| 肇东市| 锡林郭勒盟| 中宁县| 六枝特区| 普宁市| 嘉黎县| 瓦房店市| 务川| 沙田区| 衡阳县|