作用域安全的構造函數(shù)蚜厉。

構造函數(shù)的作用域還有安全這么一說蹈矮。很多人估計都不知道砰逻,下面通過一個例子來說明,什么是作用域不安全的構造函數(shù)泛鸟。

//大眾化的造人函數(shù)
function Person(name,age,sex){
  this.name = name;
  this.age = age;
  this.sex = sex;
}
var xiaoming = new Person("小明","20","boy"); //造了個小明 這樣做是不會有問題的
var kangkang = Person("康康","21","boy"); //這樣寫就會出問題了 大問題
console.log(this.name); //康康

以上代碼的輸出在部分人看來或許是沒錯啊 構造函數(shù)中把name的值賦給this了蝠咆。控制臺輸出的也是之前賦的值北滥。但是刚操,請注意這邊的this并不是 kangkang 這個新的對象 而是 window 對象 相當于把要給新對象的屬性值 加到了全局對象上了。導致了新建的對象在取屬性值時報錯再芋,而且在全局對象上新增了屬性(方法)造成了污染菊霜。


以上說了那么多,就是想說像上面第二種方法實例化對象的時候济赎,由于沒有new關鍵字鉴逞,導致操作的this并不是新的實例而是全局對象记某,從而可能引起頁面的問題。如:別的函數(shù)可能誤用這些變量构捡;造成全局對象過于龐大辙纬,影響訪問速度(因為變量的取值是需要從原型鏈上遍歷的)
以下是處理的辦法

//還是那個造人函數(shù)
function Person(name,age,sex){
  if (this instanceof Person){
    this.name = name;
    this.age = age;
    this.sex = sex;
  }else{
    return new Person(name, age, job);
  }
}
var xiaoming = new Person("小明","20","boy"); //造了個小明 這樣做是不會有問題的
var kangkang = Person("康康","21","boy"); //這樣寫就會出問題了 大問題
console.log(this.name); //undefined

如此就能確保不管有沒有 new 關鍵字都能正確的生成我們想要的對象實例。
當然以上修改后一定程度上解決了以上的問題叭喜。但是,若使用了構造函數(shù)竊取模式(個人理解:構造函數(shù)B中用call調用A構造函數(shù) 想使B中的this 帶有A構造函數(shù)中的屬性或方法)的繼承且不使用原型鏈蓖谢,那么就可能會破壞這個繼承捂蕴。

//還是那個造人函數(shù)
function Person(name,age,sex){
  if (this instanceof Person){
    this.name = name;
    this.age = age;
    this.sex = sex;
  }else{
    return new Person(name, age, job);
  }
}

function Programmer(skill){
  Person.call(this,"xiaoming","20","boy");
  this.skill = skill;
}
var xiaoming = new Programmer("java"); //造了個會java的小明
console.log(xiaoming .name); //undefined

相信很多人都找到了問題的關鍵所在。在實例化時由于this繼承的并不是 Person 所以用 call 調用的時候 返回的對象是新的 Person對象(執(zhí)行else里面的) this也是新的實例的 而不是屬于Programmer構造函數(shù)中的this闪幽,新生成的Programmer實例并沒有得到增長 call 調用后返回的值也沒用到 所以得到的值會是undefined啥辨;
若使用原型鏈就可以解決上面的問題了。

......省略上面的兩個構造函數(shù)
Programmer.prototype = new Person()//  ******這里的代碼是關鍵******
//以上代碼會使一個Programmer實例同時也是Person的實例盯腌。this就能通過if判斷
var xiaoming = new Programmer("java"); //造了個會java的小明
console.log(xiaoming .name); //xiaoming

作用域安全的構造函數(shù)在很多看來并沒多少用處溉知,但是為了避免造成一些難以追蹤的問題,特別是在多人協(xié)同編寫功能的情況下腕够,還是推薦使用作用域安全的構造函數(shù)级乍。

2017.03.02

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帚湘,隨后出現(xiàn)的幾起案子玫荣,更是在濱河造成了極大的恐慌,老刑警劉巖大诸,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捅厂,死亡現(xiàn)場離奇詭異,居然都是意外死亡资柔,警方通過查閱死者的電腦和手機焙贷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贿堰,“玉大人辙芍,你說我怎么就攤上這事「耄” “怎么了沸手?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長注簿。 經常有香客問我契吉,道長,這世上最難降的妖魔是什么诡渴? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任捐晶,我火速辦了婚禮菲语,結果婚禮上,老公的妹妹穿的比我還像新娘惑灵。我一直安慰自己山上,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布英支。 她就那樣靜靜地躺著佩憾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪干花。 梳的紋絲不亂的頭發(fā)上妄帘,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音池凄,去河邊找鬼抡驼。 笑死,一個胖子當著我的面吹牛肿仑,可吹牛的內容都是我干的致盟。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼尤慰,長吁一口氣:“原來是場噩夢啊……” “哼馏锡!你這毒婦竟也來了?” 一聲冷哼從身側響起伟端,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤眷篇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荔泳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕉饼,經...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年玛歌,在試婚紗的時候發(fā)現(xiàn)自己被綠了摩骨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛荞。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡创葡,死狀恐怖迎献,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情值朋,我是刑警寧澤叹侄,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站昨登,受9級特大地震影響趾代,放射性物質發(fā)生泄漏。R本人自食惡果不足惜丰辣,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一撒强、第九天 我趴在偏房一處隱蔽的房頂上張望禽捆。 院中可真熱鬧,春花似錦飘哨、人聲如沸胚想。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浊服。三九已至,卻和暖如春胚吁,著一層夾襖步出監(jiān)牢的瞬間牙躺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工囤采, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩淳。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓蕉毯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親思犁。 傳聞我的和親對象是個殘疾皇子代虾,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內容

  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念激蹲。通過函數(shù)可以封裝任意多條語句棉磨,而且...
    道無虛閱讀 4,586評論 0 5
  • 當被new調用時,設置name屬性学辱;不能不是new調用乘瓤,而是普通函數(shù)調用,則以new遞歸調用自己來為對象創(chuàng)建正確的實例
    u14e閱讀 151評論 0 0
  • 1,javascript 基礎知識 Array對象 Array對象屬性 Arrray對象方法 Date對象 Dat...
    Yuann閱讀 923評論 0 1
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,241評論 0 4
  • 前兩天和老徐在外溜達。 兩條光棍萨咕,先去萬和城西門口统抬,買自助的鮮榨橙汁喝,十塊錢五個橙子另配塑料杯和吸管一根危队,老徐現(xiàn)...
    咪兔哥閱讀 1,197評論 1 2