原型與原型鏈

一、全局對(duì)象

window的屬性

window有很多屬性,重點(diǎn)介紹以下幾個(gè):
parseInt()是將其它數(shù)據(jù)類型轉(zhuǎn)成整型數(shù)值
parseFloat()是將其他數(shù)據(jù)類型轉(zhuǎn)成浮點(diǎn)型數(shù)值
Number()是將其他數(shù)據(jù)類型轉(zhuǎn)成數(shù)值型
String()是將其它數(shù)據(jù)類型轉(zhuǎn)成字符型
Boolean()是將其它數(shù)據(jù)類型轉(zhuǎn)成布爾值
Object()是將其他數(shù)據(jù)類型轉(zhuǎn)成對(duì)象
以上是ECMA Script規(guī)定的

每個(gè)瀏覽器都會(huì)有自己私有的屬性,以下屬性沒有寫進(jìn)ECMA Script規(guī)定中:
alert()是彈窗提示
prompt()是用戶可以自己填寫內(nèi)容,并獲取該內(nèi)容
confirm()是用戶可以自己進(jìn)行確認(rèn),如果確認(rèn)則返回true,取消則返回false
console.log()是用戶可以自控制臺(tái)打印出想要打印的東西
document()是關(guān)于文檔的屬性

var n1 = 1
var n2 = new Number(1)

請(qǐng)問,此時(shí)n1和n2有什么區(qū)別呢?
這里的n1只是一個(gè)數(shù)字,存放在stack中,打印出的n1只是數(shù)字1
n2就會(huì)是一個(gè)對(duì)象,stack里面存放的是一個(gè)地址,heap中存放了很多關(guān)于它的屬性。


n1,n2在內(nèi)存中的存儲(chǔ)形式

我們知道,Number沒有toString的屬性,只有object才有toString的屬性,那我們?cè)趯?duì)Number進(jìn)行字符串轉(zhuǎn)換(toString())的時(shí)候,內(nèi)存里是一個(gè)怎樣的過程呢?
var n = 1
n.toString() ? ? ? //這里n是不應(yīng)該有toString屬性的,其實(shí)內(nèi)部有這樣的一個(gè)變換
==> temp = new Number(n)
? ? ? ?temp.toString()
之后再把temp清除

二、字符串的屬性

charAt() 獲取某一個(gè)索引對(duì)應(yīng)的字符

var s = 'abcdefg'
s.charAt(0)        //'a'   =>s[0]

charCodeAt() 獲取某一個(gè)索引對(duì)應(yīng)的字符的編碼

var s = 'a'
s.charCodeAt(0)        //97

toString(16)獲取數(shù)字的十六進(jìn)制的值

(100).toString(16)   //64

trim() 去掉空格的字符串

'    username      '.trim()
//"username"

concat() 連接兩個(gè)字符串

var s1 = 'Hello'
var s2 = 'World'
s1.concat(s2)      
//HelloWorld

slice() 分割字符串

var s1 = 'Hello'
s1.slice(0,2)
//"He"
s1.slice(0,3)
//"Hel"

replace() 替換字符串中的某位元素

var s1 = 'Hello'
s1.replace('e','o')
//"Hollo"

但值得注意的是,s1還是"Hello"

split() 將一個(gè)字符串分割為字符串?dāng)?shù)組

var str="How are you doing today?"
document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

//How,are,you,doing,today?
//H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
//How,are,you

提問:打印結(jié)果是什么?

var f1 = false
var f2 = new Boolean(false)
if(f1){console.log(1)}
if(f2){console.log(2)}

打印的結(jié)果是2,因?yàn)閷?duì)象的bool值都為true,f2是一個(gè)對(duì)象

三、原型與原型鏈

每一個(gè)對(duì)象都有一些公共的屬性,例如toString(),valueOf()等等,如果創(chuàng)建一個(gè)對(duì)象,就要給這個(gè)對(duì)象這些屬性的話,就很浪費(fèi)空間,因此,我們給這個(gè)對(duì)象一個(gè)_proto_屬性,這個(gè)屬性里就包含了該對(duì)象擁有的公共屬性,我們將這個(gè)公共屬性全部放到一個(gè)對(duì)象里,這就是叫做prototype,也就是原型。我們可以看到:
var o1 = {}
var o2 = {}
o1.toString === o2.toString
true
說明o1和o2的toString是一樣的,他們公用同一個(gè)toString。

然而,不是對(duì)象的其他的數(shù)據(jù)類型也有很多公共的屬性,例如Number,Number有很多自帶的屬性,例如toString(16),toFixed(),toExponential(),這些屬性是Object沒有的,這時(shí),Number一開始就指向的是所有Number自帶的公共屬性,在這個(gè)公共屬性中,又有一個(gè)_proto_,指向Object的公共屬性,Object的屬性是所有數(shù)據(jù)類型的公共屬性。prototype是瀏覽器給的,因?yàn)椴蛔寯?shù)據(jù)類型自帶的共有屬性被垃圾回收,prototype也是一個(gè)對(duì)象。

原型鏈

如圖所示,string,number,bool都會(huì)先指向自帶的公共屬性,然后再指向object的公共屬性,因此形成一個(gè)原型鏈。

提問:有下劃線的proto和無下劃線的prototype的區(qū)別是什么?
答:第一個(gè)是對(duì)象的屬性,第二個(gè)是函數(shù)的屬性

四、燒腦環(huán)節(jié)

創(chuàng)建對(duì)象

我們應(yīng)當(dāng)首先看懂上面的圖,new一個(gè)對(duì)象后,該對(duì)象的_proto等于該函數(shù)的prototype的。
例如:var n = new Number(1)
此時(shí),n是一個(gè)對(duì)象,n的_proto
指向的是Number的prototype。
以下定理是我們應(yīng)該牢記的:
1.對(duì)象會(huì)有一個(gè)_proto屬性
2.函數(shù)有一個(gè)prototype對(duì)象
3.prototype對(duì)象 是一個(gè)對(duì)象,所以它有_proto
,所有的prototype對(duì)象的_proto_都指向Object.prototype

var 對(duì)象 = new 函數(shù)()
①對(duì)象._proto_ === 函數(shù).prototype???????
②函數(shù).prototype._proto_ === Object.prototype
③函數(shù)._proto_ === Function.prototype
④Function._proto_ === Function.prototyoe
⑤Function.prototype._proto_ ===Object.prototype

對(duì)于②,函數(shù).prototype是一個(gè)對(duì)象,所以它的_proto是指向Object.prototype
對(duì)于③,函數(shù)是由Function構(gòu)造的,所以它的_proto
是指向Function的prototype
對(duì)于④,F(xiàn)unction優(yōu)先是一個(gè)函數(shù),再是一個(gè)對(duì)象,所以在④中,F(xiàn)unction的_proto_是指向自己的prototype

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容