不可變洞渤,原始數(shù)據(jù)的類文件對象&&原型鏈

在面向?qū)ο蠹昂瘮?shù)編程語言中阅嘶,不可變對象是一種對象。在被創(chuàng)造之后载迄,它的狀態(tài)就不可以被改變讯柔。狀態(tài)可以被改變的對象,則被稱為可變對象护昧。

這里狀態(tài)可以簡單理解為對象的值魂迄。


在javascript中,原始值(undefined, null, 布爾值惋耙, 數(shù)字和字符串)這些都是不可變原始值捣炬。
理解:不可變說的是一旦這些基本類型值創(chuàng)建后會一直保存其內(nèi)存地址熊昌,直到被瀏覽器的垃圾回收機制回收。而我們一直用的創(chuàng)建一個字符串變量湿酸,只是將這個變量指向了該字符串的內(nèi)存地址婿屹,當(dāng)改變該變量的值,也就是改變了該變量指向的字符串內(nèi)存地址稿械,而原來的字符串還在內(nèi)存中存在选泻。

js對象的屬性值發(fā)生改變,會創(chuàng)建一個新的屬性值,然后改變的是該屬性指向的內(nèi)存地址桐汤。對象本身的內(nèi)存地址是沒有改變的系宫。這樣對象的內(nèi)存地址沒有變化。
原始值:任何方法都無法更改一個原始值窝撵。

示例

let s = 'hello'; // 這里申請內(nèi)存,并保存數(shù)據(jù)hello襟铭,并把內(nèi)存地址賦給
s.toUpperCase(); // 生成一個新的數(shù)據(jù)HELLO碌奉,并申請內(nèi)存保存之
s = s.toUpperCase(); // 把新的內(nèi)存地址賦給s,此時s的值就是HELLO了寒砖。原來的'hello'會被回收赐劣。

一、js數(shù)據(jù)

1.typeof

  1. typeof返回一個字符串哩都,指示未經(jīng)計算操作數(shù)的類型魁兼。
  2. typeof能區(qū)分值類型的詳細(xì)類型,但對于引用類型就不行了漠嵌。
  3. typeof null 返回object是歷史遺留問題咐汞,自從js出現(xiàn)就是這樣的。
  4. typeof通常只返回6種數(shù)據(jù)類型:number,string,boolean,undefined,object,function,symbol
    js的typeof數(shù)據(jù)類型.png

2.instanceof

instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性儒鹿。
語法:

// obj是使用構(gòu)造函數(shù)構(gòu)造的變量化撕,Object是構(gòu)造函數(shù)的名稱
obj instanceof Object
image.png
image.png

3.字面量創(chuàng)建變量和new 構(gòu)造函數(shù)創(chuàng)建變量

什么是字面量?
兩者區(qū)別:

  1. 字面量創(chuàng)建對象
let obj = { id: 1, };
let str = 'abc';
let num = 123;

上面創(chuàng)建變量時约炎,不會調(diào)用構(gòu)造函數(shù)植阴。是一個原始類型(基本類型)的值。
使用new后圾浅,會將原始數(shù)據(jù)類型轉(zhuǎn)為對象墙贱。

  1. 構(gòu)造函數(shù)創(chuàng)建變量
let obj = new Object({ id:1 });
let str = new String('abc');
let num = new Number(123);

new方式創(chuàng)建變量的本質(zhì)是方法調(diào)用,會遍歷__proto__中的方法和屬性贱傀,找到該構(gòu)造函數(shù)的方法惨撇,然乎生產(chǎn)方法調(diào)用必須的堆棧信息,方法調(diào)用結(jié)束后府寒,還要釋放堆棧魁衙,性能不如字面量方式报腔。

問題

  1. 字面量方式創(chuàng)建的變量,為什么有構(gòu)造函數(shù)函數(shù)創(chuàng)建的變量的方法和屬性剖淀?
    可以參考這個問題
    涉及到包裝類型纯蛾。
    發(fā)現(xiàn)一個有趣的:
    image.png

4.原型

  1. 原型對象:這個原型對象包含所有實例共享的屬性和方法。其實最初指的是函數(shù)prototype纵隔。

    image.png

  2. 當(dāng)使用構(gòu)造函數(shù)實例化時翻诉,實例化后的是對象,會將實例化對象的__proto__指向構(gòu)造函數(shù)的prototype捌刮。

  3. 任意一個函數(shù)(包括構(gòu)造函數(shù))都有一個prototype屬性碰煌。函數(shù)也是對象。

  4. 所有對象都有__proto__屬性绅作。構(gòu)造函數(shù)實例化后的是一個對象芦圾。


自己理解示例:

let str = new String('abc')

一、str.__proto__

1. str.__proto__是對象俄认,沒有prototype个少。
2. str.__proto__指向(或繼承)構(gòu)造函數(shù)StringString.prototype

image.png

二眯杏、String.prototype

1. String.prototype包含構(gòu)造函數(shù)String自定義的屬性和方法夜焦。String.prototype還包含構(gòu)造器constructor__proto__
1.1 String.protype.constructor指向本身的函數(shù)String

image.png

1.2 String.prototype.__proto__:因為String.protype.是對象岂贩,下面無構(gòu)造函數(shù)了茫经,所以String.prototype.__proto__指向的是對象的原型prototype。對象指的不是Object河闰,Object是函數(shù)。

image.png

新建函數(shù)時姜性,函數(shù)的prototype下的__proto__指向的是對象的原型prototype部念。
新建的對象沒有prototype屬性氨菇。

三、String.__proto__

1. String.__proto__指向的是構(gòu)造函數(shù)String的構(gòu)造函數(shù)Functionprototype乌询,即Function.prototype妹田。

image.png

四、Function.prototype

  1. Function.protype.constructor指向本身的函數(shù)Function

    image.png

  2. Function.prototype.__proto__:因為Function.protype.是對象鬼佣,下面無構(gòu)造函數(shù)了驶拱,所以Function.prototype.__proto__指向的是對象的原型prototype

    image.png

五晶衷、Function.__proto__

1. Function.__proto__指向Function.prototype蓝纲。即 Function.__proto__Function.prototype相等。所以Function.__proto__也指向的是對象的原型prototype晌纫。

image.png


5.原型鏈

  1. 由于__proto__是任何對象都有的屬性税迷,所以最終會形成一條__proto__連起來的鏈條,遞歸訪問__proto__必須最終到頭缸匪,并且值是null翁狐。
  2. 當(dāng)js引擎查找對象的屬性時,先查找對象本身是否存在該屬性凌蔬,如果不存在露懒,會在原型鏈上找,但不會查找自身的prototype砂心。
    image.png
  3. 給原型prototype添加方法和屬性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懈词,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辩诞,更是在濱河造成了極大的恐慌坎弯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異崎脉,居然都是意外死亡囚灼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织中,“玉大人层坠,你說我怎么就攤上這事破花。” “怎么了峭梳?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我治笨,道長旷赖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任锐锣,我火速辦了婚禮姿骏,結(jié)果婚禮上分瘦,老公的妹妹穿的比我還像新娘悦施。我一直安慰自己抡诞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞋吉,像睡著了一般坯辩。 火紅的嫁衣襯著肌膚如雪漆魔。 梳的紋絲不亂的頭發(fā)上改抡,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天夷陋,我揣著相機與錄音骗绕,去河邊找鬼荆忍。 笑死叽唱,一個胖子當(dāng)著我的面吹牛棺亭,可吹牛的內(nèi)容都是我干的侦铜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俊卤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狠怨,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憎蛤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棚辽,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了遣妥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箫踩。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慨削,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玫芦,我是刑警寧澤桥帆,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布宝冕,位于F島的核電站菊卷,受9級特大地震影響洁闰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聘裁,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镣陕。 院中可真熱鬧,春花似錦理肺、人聲如沸妹萨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽揪。三九已至,卻和暖如春辅斟,著一層夾襖步出監(jiān)牢的瞬間转晰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工士飒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查邢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓酵幕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親门躯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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