標題中,__proto__
的__
是由兩個_
構成的
共有屬性(原型)
這個觀點就是,一段代碼有諸多個對象,對象有許多的屬性、要領,把這麼多個對象雷同的屬性、要領提取出來,弄在一個新對象里,人人一升引。對象里就只需存儲新對象的地點,到時候要用到這些屬性、要領了,再調出來運用。
看下圖,淺易內存圖。左側原始代碼區里聲清楚明了新對象O1,var O1=new Object()
,右側Heap里存儲(從左往右看第一個箭頭的右側都是Heap,沒有Stack)。左側原始代碼區里又聲清楚明了新對象O2,var O2=new Object()
,右側Heap里存儲。作為一個對象,有些要領是都有的,比方toString()
,valueOf
等,所以提取出來,放在共有屬性的Heap里,地點隨機為A100,那末O1,O2的Heap里就寄存共有屬性的地點__proto__:A100
。你寫代碼O1.toString()
,就順着上面的箭頭找到O1的Heap,找一遍沒有,又找到__proto__
里彷佛有東西,就找到了共有屬性的Heap,內里有toString()
要領。
__proto__
和 prototype
的區分
個人明白,__proto__
是個地點,用於指向另一個對象,比方某個共有要領庫。prototype
就是本個對象一切要領的鳩合。
var a=new Number(1);
a.__proto__ //這個就指向了Number範例的共有要領庫
a.__proto__.prototype //這個就示意Number範例的共有要領庫里一切的要領
簡樸範例和對象
諸如像下面代碼所示,就是簡樸範例的簡樸聲明。這模樣聲明的變量只包括簡樸範例值,沒有別的像toString()
,valueOf
,toFixed
……等等的要領
var a=1;
var b="abc";
var c=true;
諸如像下面代碼所示,就是簡樸範例的對象聲明。這模樣聲明的變量除了包括簡樸範例值,還自帶了一些範例專屬要領和對象要領等等的要領
var a=new Number(1);
var b=new String("abc");
var c=new Boolean(true);
範例專屬要領和對象要領就是上面講的共有屬性(原型)。這就彷佛,一切的Number範例有自身的要領庫,一切的String範例有自身的要領庫,一切的Boolean範例有自身的要領庫,這些都是對象,所以末了一切Object範例有一個最最通用的要領庫。畫成圖如下圖。
- S1,S2 → String範例 → 自身的Heap → String範例要領庫 → Object要領庫
- n1,n2 → Number範例 → 自身的Heap → Number範例要領庫 → Object要領庫
- b1,b2 → Boolean範例 → 自身的Heap → Boolean範例要領庫 → Object要領庫
- o1,o2 → Object範例 → 自身的Heap → Object要領庫
簡樸聲明和對象聲明的區分
講道理,用起來沒啥區分,要領該挪用的挪用,屬性該有的都一樣有。但實際上,是JavaScript自身做了處置懲罰的,方便了開發人員。
- 你先用簡樸聲明聲明一個簡樸範例
var n=1
- 簡樸範例瑕玷是,它就是一個值,啥也沒有,想對它舉行種種操縱,不可
- 怎麼辦!如許也太傻太沒用了吧!!那,暫時轉換下吧~~~
暫時轉換:
- 當你寫下如許的代碼
var b=n.toString();
- 豎立暫時變量
temp
,var temp=new Number(n)
- 如許就能夠挪用
temp
的toString()
要領了,temp.toString()
- 當你寫下如許的代碼
- 好了,暫時轉換好了,準確返回了
n.toString()
- 末了刪除暫時變量
temp
,完畢,temp
來了、做了、走了
再來看看內存圖
- 左側原始代碼區,簡樸聲明變量
var n=1;
,中心Stack里存儲n的值 - 挪用要領
n.toString()
,Stack里豎立新變量temp
,這是個對象,所以Heap里存儲temp
的一切內容,Stack里存儲Heap地點ADDR 6
- 如許
n.toString()
,就即是temp.toString()
- 返回
temp.toString()
后,temp
就被消逝了,Heap里的內容也隨之消逝
Number範例
兩種聲明體式格局
var a=1; var b=new Number(1);
Number範例專屬要領
- 聲清楚明了一個變量,輸出變量后看到,內里就只有一個東西
__proto__
,這是個地點,指向Number範例公用的要領庫 - 點開
__proto__
,看到的就是Number範例共用的要領庫 - 裡邊看到另有個
__proto__
,由於Number範例也是對象呀,所以這個__proto__
指向Object範例公用的要領庫。點開這個__proto__
,就看到了Object範例公用的要領庫
- 聲清楚明了一個變量,輸出變量后看到,內里就只有一個東西
Number範例經常使用要領
toString() toFixed() toExponential() valueOf()
charCodeAt(0)
toString(16)
String範例
兩種聲明體式格局
var a="abc"; var b=new String("abc");
String範例專屬要領
- 聲清楚明了一個變量,輸出變量后看到,內里除了這個String對象的信息,另有一個東西
__proto__
,這是個地點,指向String範例公用的要領庫 - 點開
__proto__
,看到的就是String範例共用的要領庫。
。
。 - 裡邊看到另有個
__proto__
,由於String範例也是對象呀,所以這個__proto__
指向Object範例公用的要領庫。點開這個__proto__
,就看到了Object範例公用的要領庫
- 聲清楚明了一個變量,輸出變量后看到,內里除了這個String對象的信息,另有一個東西
String範例經常使用要領
trim() concat() slice()
Boolean範例
兩種聲明體式格局
var a=true; var b=new Boolean(true);
Boolean範例專屬要領
- 聲清楚明了一個變量,輸出變量后看到,內里就只有一個東西
__proto__
,這是個地點,指向Boolean範例公用的要領庫 - 點開
__proto__
,看到的就是Boolean範例共用的要領庫 - 裡邊看到另有個
__proto__
,由於Boolean範例也是對象呀,所以這個__proto__
指向Object範例公用的要領庫。點開這個__proto__
,就看到了Object範例公用的要領庫
- 聲清楚明了一個變量,輸出變量后看到,內里就只有一個東西
Boolean範例經常使用要領
Object範例
兩種聲明體式格局
var a={name:1}; var b=new Object({name:1});
Object範例專屬要領
- 聲清楚明了一個變量,輸出變量后看到,內里對象a基本信息,另有一個東西
__proto__
,這是個地點,指向Object範例公用的要領庫 - 點開
__proto__
,a自身就是對象沒有別的範例,所以看到的就是Object範例共用的要領庫
- 聲清楚明了一個變量,輸出變量后看到,內里對象a基本信息,另有一個東西
Object範例經常使用要領
toString() valueOf()