最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中構(gòu)造函數(shù)的基本特性與優(yōu)缺點

 更新時間:2022年06月29日 08:49:33   作者:小旭2021  
這篇文章介紹了JS中構(gòu)造函數(shù)的基本特性與優(yōu)缺點,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

構(gòu)造函數(shù):如用函數(shù)用來初始化(使用new運算符)一個新建的對象,我們稱之為構(gòu)造函數(shù)(constructor)

function Person(){
    this.name = "zqq";
    this.age = 28;
}
var p = new Person();

當(dāng)以new調(diào)用構(gòu)造函數(shù)(執(zhí)行var p = new Person())時,函數(shù)內(nèi)部會發(fā)生以下情況:

1.創(chuàng)建一個空對象

var p = {};

2.this變量指向?qū)ο髉

Person.call(p)

3.p繼承了構(gòu)造函數(shù)Person()的原型

p.__proto__ = Person.prototype

4.執(zhí)行構(gòu)造函數(shù)Person()內(nèi)的代碼

構(gòu)造函數(shù)和普通函數(shù)的區(qū)別:

1.構(gòu)造函數(shù)使用new關(guān)鍵字調(diào)用;普通函數(shù)不用new關(guān)鍵字調(diào)用;

var p = new Person();
var p = Person();

2.構(gòu)造函數(shù)內(nèi)部可以使用this關(guān)鍵字;普通函數(shù)內(nèi)部不建議使用this,因為這時候this指向的是window全局對象,這樣無意間就會為window添加了一些全局變量或函數(shù)

在構(gòu)造函數(shù)內(nèi)部,this指向的是構(gòu)造出來的新對象

在普通函數(shù)內(nèi)部,this指向的是window全局對象

3.構(gòu)造函數(shù)默認(rèn)不用return返回值;普通函數(shù)一般都有return返回值

構(gòu)造函數(shù)會默認(rèn)返回this,也就是新的實例對象

普通函數(shù)如果沒有return值的話,返回undefined

如果使用了return,那返回值會根據(jù)return值的類型而有所不同

return的是五種簡單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined的話,構(gòu)造函數(shù)會忽略return的值,依然返回this對象;而普通函數(shù)會返回return后面的值
 
function Person(){
    var a;
    this.name = "zqq";
    this.age = 28;
    return a;
}
var p = new Person();//返回this對象
var p = Person();//因為a沒初始化,所以a是undefined,而undefined屬于簡單數(shù)據(jù)類型,所以返回undefined,String,Number,Boolean,Null同理
 
 
如果return的是引用類型:Array,Date,Object,Function,RegExp,Error的話,構(gòu)造函數(shù)和普通函數(shù)都會返回return后面的值
 
function Person(){
    var arr = [];
    this.name = "zqq";
    this.age = 28;
    return arr;
}
var p = new Person();//返回arr空數(shù)組,Date,Object,Function,RegExp,Error同理
var p1 = new Person();//返回arr空數(shù)組,Date,Object,Function,RegExp,Error同理

4.構(gòu)造函數(shù)首字母建議大寫;普通函數(shù)首字母建議小寫

構(gòu)造函數(shù)的優(yōu)點與缺點

優(yōu)點就是能夠通過instanceof識別對象,缺點是每次實例化一個對象,都會把屬性和方法復(fù)制一遍

function CreateObj(uName) {
              this.userName = uName;
              this.showUserName = function () {
              return this.userName;
            }
        }
 
var obj1 = new CreateObj('ghostwu');
var obj2 = new CreateObj('衛(wèi)莊');
 
console.log( obj1.showUserName === obj2.showUserName ); //false

從以上執(zhí)行結(jié)果,可以看出obj1.showUserName和obj.showUserName不是同一個【在js中,引用類型比較的是地址, 函數(shù)是一種引用類型】,而是存在兩個不同
的內(nèi)存地址,因為每個對象的屬性是不一樣的,這個沒有什么問題,但是方法執(zhí)行的都是一樣的代碼,所以沒有必要復(fù)制,存在多份,浪費內(nèi)存.這就是缺點

怎么解決構(gòu)造函數(shù)的方法復(fù)制多次的問題?

function CreateObj(uName) {
  this.userName = uName;
  this.showUserName = showUserName;
}
function showUserName() {
  return this.userName;
}
var obj1 = new CreateObj('ghostwu');
var obj2 = new CreateObj('衛(wèi)莊');
console.log(obj1.showUserName === obj2.showUserName); //true

把對象的方法指向同一個全局函數(shù)showUserName, 雖然解決了多次復(fù)制問題,但是全局函數(shù)非常容易被覆蓋,也就是大家經(jīng)常說的污染全局變量.

比較好的解決方案?

通過原型(prototype)對象,把方法寫在構(gòu)造函數(shù)的原型對象上

function CreateObj(uName) {
  this.userName = uName;
}
CreateObj.prototype.showUserName = function () {
  return this.userName;
}
var obj1 = new CreateObj('ghostwu');
var obj2 = new CreateObj('衛(wèi)莊');
console.log(obj1.showUserName === obj2.showUserName); //true

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析JS操作DOM的一些常用方法

    淺析JS操作DOM的一些常用方法

    下面小編就為大家?guī)硪黄狫S操作DOM的一些常用方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 詳解javascript設(shè)計模式三:代理模式

    詳解javascript設(shè)計模式三:代理模式

    這篇文章主要介紹了javascript設(shè)計模式三:代理模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 淺談Javascript 執(zhí)行順序

    淺談Javascript 執(zhí)行順序

    這篇文章主要介紹了Javascript 執(zhí)行順序,有需要的朋友可以參考一下
    2013-12-12
  • javascript標(biāo)簽在頁面中的位置探討

    javascript標(biāo)簽在頁面中的位置探討

    在制作網(wǎng)頁的過程中需要引用很多的js文件,至于他正確位置好多的朋友就會有疑問了,接下來為大家詳細(xì)介紹下
    2013-04-04
  • 在瀏覽器中打開或關(guān)閉JavaScript的方法

    在瀏覽器中打開或關(guān)閉JavaScript的方法

    這篇文章主要介紹了在瀏覽器中打開或關(guān)閉JavaScript的方法,由于歷史遺留問題,JS在目前任何瀏覽器中都是標(biāo)配...所以不想加載JS也可以選擇關(guān)閉,需要的朋友可以參考下
    2015-06-06
  • js中widow.open()方法使用詳解

    js中widow.open()方法使用詳解

    本文為大家詳細(xì)介紹下js中widow.open()方法的各項參數(shù)及使用示例,有想學(xué)習(xí)的朋友可不要錯過了,希望對大家有所幫助
    2013-07-07
  • javascript 基礎(chǔ)簡介 適合新手學(xué)習(xí)

    javascript 基礎(chǔ)簡介 適合新手學(xué)習(xí)

    在網(wǎng)絡(luò)或書籍所說的JavaScript大部分指客戶端JavaScript。
    2009-09-09
  • JSON為什么那樣紅為什么要用json(另有洞天)

    JSON為什么那樣紅為什么要用json(另有洞天)

    json是1年內(nèi)迅速紅遍全球的東東;json.org是一種簡潔有效的數(shù)據(jù)載體,是一種用字符串表示復(fù)雜js對象的方式,后端好生成,前端0解釋,接下來詳細(xì)介紹json風(fēng)行的幾點原因
    2012-12-12
  • javascript Window及document對象詳細(xì)整理

    javascript Window及document對象詳細(xì)整理

    注:頁面上元素name屬性以及JavaScript引用的名稱必須一致包括大小寫否則會提示你1個錯誤信息 引用的元素為空或者不是對象
    2011-01-01
  • js異常捕獲方法介紹

    js異常捕獲方法介紹

    本篇文章小編為大家介紹一下關(guān)于js的異常捕獲,有需要的朋友可以參考一下
    2013-04-04

最新評論

寿阳县| 宁城县| 邢台市| 葫芦岛市| 蓝山县| 龙里县| 新余市| 大庆市| 宽城| 额敏县| 乐至县| 德令哈市| 吉首市| 合阳县| 石楼县| 周宁县| 东乡族自治县| 永修县| 北碚区| 交口县| 宝丰县| 清镇市| 阿合奇县| 宜黄县| 句容市| 罗田县| 临潭县| 抚宁县| 广河县| 九龙城区| 镇康县| 弥勒县| 台北县| 临沧市| 合阳县| 营山县| 洪洞县| 普安县| 衡阳市| 扬州市| 红原县|