js constructor的理解

每個(gè)對(duì)象都有一個(gè)constructor

   function Animal(){
        
   }
   var  anim = new Animal();

在 JavaScript 中闰围,每個(gè)函數(shù)對(duì)象都有名為“prototype”的屬性(上面提到過Function.prototype函數(shù)對(duì)象是個(gè)例外捏顺,沒有prototype屬性)革娄,
用于引用原型對(duì)象恬涧。此原型對(duì)象又有名為“constructor”的屬性,它反過來引用函數(shù)本身关炼。這是一種循環(huán)引用,而函數(shù)也是對(duì)象具有__proto__屬性
Animal._proto__. constructor就指向了構(gòu)造它的構(gòu)造函數(shù)

    Animal.prototype.constructor===Animal //true

普通對(duì)象constructor指向問題
Object.hasOwnProperty("constructor")//false
console.dir(Object)

上面兩句都可以看出Object構(gòu)造函數(shù)沒有直接的constructor屬性昆淡,而是在他的prototype上面。


上圖可以看出Animal也沒有直接的constructor屬性盒件,而是在他的prototype上面蹬碧,綜上可知:所有的函數(shù)默認(rèn)情況下其constructor都是在prototype上面。所以anim.constructor===anim.__proto_._constructor===Animal.prototype.constructor,所以在創(chuàng)建構(gòu)造函數(shù)的時(shí)候經(jīng)常指定構(gòu)造函數(shù)為自身炒刁,這樣其實(shí)例化的對(duì)象的constructor就指向了創(chuàng)建他的函數(shù)恩沽。

function Person (name,age,sex){
    this.name = name;
    this.age = age;
    this.sex = sex;
}
 
Person.prototype = {
    constructor:Person,//指定其構(gòu)造函數(shù)為自身
    sayHello:function(){
        console.log('hello');
    }
}

如果不加constructor:

Person.prototype = {
    sayHello:function(){
        console.log('hello');
    }
}

圖片.png

第一級(jí)proto沒了constructor,而是在第二級(jí)翔始,也就是Object.prototype.constructor罗心。
如果想避免這種情況可以不直接給函數(shù)賦對(duì)象,而是一個(gè)個(gè)屬性賦值:

Person.prototype.sayHello = function(){
        console.log('hello');
}

這樣的話constructor默認(rèn)指向了Person

1. 對(duì)象字面量構(gòu)造出的對(duì)象的構(gòu)造函數(shù)就是Object()
    var kk={};
    kk.constructor
    //function Object() { [native code] }
    kk.constructor===Object //true
2. 通過構(gòu)造函數(shù)構(gòu)造出來的普通對(duì)象
    anim.constructor
    //function Animal(){}
3. 函數(shù)對(duì)象
    Animal.constructor
    //function Function() { [native code] }
    
    Animal===Animal.prototype.constructor //true
    Function.prototype.constructor===Function //true

每個(gè)函數(shù)的的原型的構(gòu)造器都指向它自己

4. Object和Function函數(shù)對(duì)象
    Object.constructor===Function //true
    Function.constructor===Function //true

因?yàn)镺bject和Function函數(shù)對(duì)象都是由Function構(gòu)造函數(shù)new來的

5. 其他js內(nèi)置對(duì)象

Array,String,Number,Boolean,Date,RegExp;Math,JSON,console

Array,String,Number,Boolean,Date,RegExp 這個(gè)幾個(gè)都是函數(shù)城瞎,typeof后為:"function",所以他們的構(gòu)造函數(shù)指向Function()
Math,JSON,console typeof后為"object",他們的構(gòu)造函數(shù)指向Object()

結(jié)論:每個(gè)對(duì)象的構(gòu)造函數(shù)指向構(gòu)造出來他的函數(shù)渤闷,每個(gè)函數(shù)的的原型的構(gòu)造器都指向它自己

constructor并沒什么作用,instanceof 的原理就是右邊變量的 prototype 在左邊變量的原型鏈上就通過全谤,并不是根據(jù)constructor判斷肤晓。
JavaScript 中對(duì)象的 constructor 屬性的作用是什么爷贫?賀老指出:
constructor屬性不影響任何JavaScript的內(nèi)部屬性认然。instanceof檢測(cè)對(duì)象的原型鏈补憾,通常你是無法修改的(不過某些引擎通過私有的proto屬性暴露出來)。constructor其實(shí)沒有什么用處卷员,只是JavaScript語言設(shè)計(jì)的歷史遺留物盈匾。由于constructor屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù)毕骡,只是一個(gè)提示削饵。不過,從編程習(xí)慣上未巫,我們應(yīng)該盡量讓對(duì)象的constructor指向其構(gòu)造函數(shù)窿撬,以維持這個(gè)慣例。

Js中Prototype叙凡、proto劈伴、Constructor、Object握爷、Function關(guān)系介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跛璧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子新啼,更是在濱河造成了極大的恐慌追城,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燥撞,死亡現(xiàn)場(chǎng)離奇詭異座柱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叨吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門辆布,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茶鉴,你說我怎么就攤上這事锋玲。” “怎么了涵叮?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵惭蹂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我割粮,道長(zhǎng)盾碗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任舀瓢,我火速辦了婚禮廷雅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己航缀,他們只是感情好商架,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芥玉,像睡著了一般蛇摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灿巧,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天赶袄,我揣著相機(jī)與錄音,去河邊找鬼抠藕。 笑死饿肺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盾似。 我是一名探鬼主播唬格,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颜说!你這毒婦竟也來了购岗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤门粪,失蹤者是張志新(化名)和其女友劉穎喊积,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玄妈,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乾吻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拟蜻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绎签。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酝锅,靈堂內(nèi)的尸體忽然破棺而出诡必,到底是詐尸還是另有隱情,我是刑警寧澤搔扁,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布爸舒,位于F島的核電站,受9級(jí)特大地震影響稿蹲,放射性物質(zhì)發(fā)生泄漏扭勉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一苛聘、第九天 我趴在偏房一處隱蔽的房頂上張望涂炎。 院中可真熱鬧忠聚,春花似錦、人聲如沸唱捣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爷光。三九已至,卻和暖如春澎粟,著一層夾襖步出監(jiān)牢的瞬間蛀序,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工活烙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徐裸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓啸盏,卻偏偏與公主長(zhǎng)得像重贺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子回懦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 理解 javascript 的原型鏈及繼承 以上所有的運(yùn)行結(jié)果都是 true; 三種構(gòu)造對(duì)象的方法: 通過對(duì)象字面...
    你期待的花開閱讀 1,505評(píng)論 0 3
  • 在JavaScript中气笙,原型鏈作為一個(gè)基礎(chǔ),老生長(zhǎng)談怯晕,今天我們就來深入的解讀一下原型鏈潜圃。 本章主要講的是下面幾點(diǎn)...
    Devinnn閱讀 1,398評(píng)論 1 6
  • 八月份計(jì)劃未完成,沒有充分利用時(shí)間舟茶,被各種亂入的事情所打擾谭期,反而荒廢了月計(jì)劃上所要寫的內(nèi)容,內(nèi)心還是比較愧疚的吧凉。 ...
    yimy201314閱讀 228評(píng)論 0 0
  • 不知是第幾次這樣出門 漫無目的的走個(gè)不停 其實(shí)我沒有毛病 只是想找個(gè)方式發(fā)泄 忍住沖動(dòng)不去見你 就在我可以控制住自...
    何野閱讀 303評(píng)論 0 0
  • 眼界也是一筆財(cái)富隧出,獨(dú)自旅行也更能歷練自己。特別是女孩子阀捅,很多人認(rèn)為女生不要自己出門旅行的觀點(diǎn)胀瞪,這更像是一種難被察覺...
    老金博客閱讀 1,588評(píng)論 1 4