全局對象 window
ECMAScript 規(guī)定全局對象叫做 global寄症,但是瀏覽器把 window 作為全局對象(瀏覽器先存在的)
window 就是一個(gè)哈希表焰坪,有很多屬性老赤。
window 的屬性就是全局變量臼膏。這些全局變量分為兩種:
一種是 ECMAScript 規(guī)定的 | 一種是瀏覽器自己加的屬性 |
---|---|
global.parseInt global.parseFloat global.Number global.String global.Boolean global.Object |
window.alert window.prompt window.comfirm window.console.log window.console.dir window.document window.document.createElement window.document.getElementById |
全局函數(shù)
-
Number
var n = new Number(1) 創(chuàng)建一個(gè) Number 對象 -
String
var s = new String('hello') 創(chuàng)建一個(gè) String 對象 -
Boolean
var b = new Boolean(true) 創(chuàng)建一個(gè) Boolean 對象 -
Object
var o1 = {}
var o2 = new Object()
聲明對象方法 o1 和 o2 沒區(qū)別仿畸。但是不相等危尿,因?yàn)閮?nèi)存指向地址不同呐萌。
原型(公用屬性)
所有對象都有 toString 和 valueOf 屬性,那么我們是否有必要給每個(gè)對象一個(gè) toString 和 valueOf 呢脚线?
明顯不需要搁胆。
JS 的做法是把 toString 和 valueOf 放在一個(gè)對象里(暫且叫做公用屬性組成的對象)
然后讓每一個(gè)對象的 __proto__
存儲這個(gè)「公用屬性組成的對象」的地址。
同理,每一個(gè) new Number對象渠旁,new String對象攀例,new Boolean對象都有它們的公用屬性,
由于它們都是對象顾腊,在公用屬性中也有一個(gè) __proto__
存儲對象的「公用屬性組成的對象」的地址粤铭。
這個(gè)「公用屬性組成的對象」就是原型。
原型鏈
在我們創(chuàng)建了 var n = new Number(1)
后杂靶,n.__proto__
就指向 Number對象的原型prototype梆惯,Number對象的原型包括一些Number的公共屬性和存儲對象原型的 __proto__
。那么 n.__proto__.__proto__
就是指向?qū)ο蟮脑?Object.prototype
吗垮。這樣就形成了一條原型鏈垛吗。
var n = new Number(1)
n.__proto__ === Number.prototype // true
n.__proto__.__proto__ === Object.prototype // true
var s = new String('hello')
s.__proto__ === String.prototype // true
s.__proto__.__proto__ === Object.prototype // true
var b = new Boolean(true)
b.__proto__ === Boolean.prototype // true
b.__proto__.__proto__ === Object.prototype // true
在var 對象 = new 函數(shù)
這樣的構(gòu)造函數(shù)中,可以得出公式:
對象.__proto__ === 函數(shù).prototype
烁登。
在無代碼情況下怯屉,
prototype
是瀏覽器寫的,本身就存在饵沧,是某對象的共同屬性的引用锨络,為了不讓對象的公用屬性因沒有被調(diào)用而被垃圾回收而存在。在用戶存儲數(shù)據(jù)時(shí)狼牺,
__proto__
是某對象公用屬性的引用羡儿,是為了用戶使用其共用屬性中的方法而存在的
引申公式:
Object.__proto__ === Function.prototype
Object.prototype.__proto__ === null
Function.__proto__ === Function.prototype
Function.prototype.__proto__ === Object.prototype