關(guān)于JS面向?qū)ο?,我們首先需要了解的一個問題,就是什么是內(nèi)存!
var a = 1 發(fā)生了什么?
? ?我們常說的內(nèi)存是指的插在電腦上的內(nèi)存條,一個8g的內(nèi)存條大概40%分配給系統(tǒng),大概1G分配給瀏覽器,而分配給瀏覽的1G中大概200m分配給了JS。電腦只存0跟1,我們的代碼存到內(nèi)存里會經(jīng)過一些列操作。
? ?內(nèi)存有棧內(nèi)存(Stack)與堆內(nèi)存(Heap),JS中簡單類型(number、string、boolean、symble、null、undefined)的值一般儲存在Stack棧內(nèi)存中,復(fù)雜類型的值儲存在Heap堆內(nèi)存(以Heap地址存入,一般是對地址的引用),以下以簡單的圖示聲明到內(nèi)存發(fā)生的操作。
簡單類型的值一般操作Stack棧內(nèi)存
復(fù)雜類型值同時操作Stack棧內(nèi)存與Heap堆內(nèi)存以下為一些內(nèi)存的簡單示意
a
b
c
d
對于上述代碼中都有一個b=a的操作,這稱為“拷貝”,將棧內(nèi)存與堆內(nèi)存完全拷貝過來又稱為“深拷貝”,對所有的基本類型而言都是深拷貝(因為沒有堆內(nèi)存)。對于復(fù)雜類型,只拷貝了棧內(nèi)存而沒有拷貝堆內(nèi)存,就是“淺拷貝”。簡單理解,b=a,b變不影響a就是深拷貝,b變導(dǎo)致a變就是淺拷貝。
JS面向?qū)ο?/h2>
我們?yōu)g覽器剛打開的時候,里面就內(nèi)置了很多屬性,這就是為什么一開始瀏覽器就占據(jù)很多內(nèi)存的部分原因。對于瀏覽器自帶的對象,全局對象global,瀏覽器里稱為window。這些自帶的屬性中一部分是基于ECMAScript標(biāo)準(zhǔn),一部分是瀏覽器自己的(私有的,不同瀏覽器不同),以谷歌瀏覽器為例:
- ECMAScript標(biāo)準(zhǔn):
- parseInt
- parseFloat
- Number
- Boolean
- String
- Object
- Google瀏覽器私有:
- alert(彈窗提示)
- promote(用戶填寫)
- confirm(確認(rèn))
- console(開發(fā)者)
- document(文檔)DOM
- history(瀏覽器)BOM
對于var a = 1,為什么可以調(diào)用toString方法就可以理解了。調(diào)用該方法的時候,瀏覽器會自動虛擬(拷貝)一個對象,然后調(diào)用其中的tostring,調(diào)用完后則消失。
關(guān)于原型與原型鏈
JavaScript 常被描述為一種基于原型的語言 (prototype-based language)——每個對象擁有一個原型對象,對象以其原型為模板、從原型繼承方法和屬性。原型對象也可能擁有原型,并從中繼承方法和屬性,一層一層、以此類推。這種關(guān)系常被稱為原型鏈 (prototype chain),它解釋了為何一個對象會擁有定義在其他對象中的屬性和方法。
準(zhǔn)確地說,這些屬性和方法定義在Object的構(gòu)造器函數(shù)(constructor functions)之上的prototype屬性上,而非對象實例本身。

要記住的一個公式
var _______ = new ______
類型:對象??????類型:函數(shù)對象
var 對象 = new 函數(shù)()
對象._ _proto_ _ == 函數(shù).prototype



