JavaScript對每個創建的對象都會設置一個原型,指向它的原型對象。
當我們用obj.xxx訪問一個對象的屬性時,JavaScript引擎先在當前對象上查找該屬性,如果沒有找到,就到其原型對象上找,如果還沒有找到,就一直上溯到Object.prototype對象,最后,如果還沒有找到,就只能返回undefined。
例如,創建一個Array對象:
var arr = [1, 2, 3];
其原型鏈是:
arr ----> Array.prototype ----> Object.prototype ----> null
Array.prototype定義了indexOf()、shift()等方法,因此你可以在所有的Array對象上直接調用這些方法。
當我們創建一個函數時:
function foo() { return 0;}函數也是一個對象,它的原型鏈是:
foo ----> Function.prototype ----> Object.prototype ----> null
由于Function.prototype定義了apply()等方法,因此,所有函數都可以調用apply()方法。
很容易想到,如果原型鏈很長,那么訪問一個對象的屬性就會因為花更多的時間查找而變得更慢,因此要注意不要把原型鏈搞得太長。
構造函數
除了直接用{ ... }創建一個對象外,JavaScript還可以用一種構造函數的方法來創建對象。它的用法是,先定義一個構造函數:
function Student(name) { this.name = name; this.hello = function () { alert('Hello, ' + this.name + '!'); }}你會問,咦,這不是一個普通函數嗎?
這確實是一個普通函數,但是在JavaScript中,可以用關鍵字new來調用這個函數,并返回一個對象:
var xiaoming = new Student('小明');xiaoming.name; // '小明'xiaoming.hello(); // Hello, 小明!注意,如果不寫new,這就是一個普通函數,它返回undefined。但是,如果寫了new,它就變成了一個構造函數,它綁定的this指向新創建的對象,并默認返回this,也就是說,不需要在最后寫return this;。
新創建的xiaoming的原型鏈是:
xiaoming ----> Student.prototype ----> Object.prototype ----> null
也就是說,xiaoming的原型指向函數Student的原型。如果你又創建了xiaohong、xiaojun,那么這些對象的原型與xiaoming是一樣的:
xiaoming
主站蜘蛛池模板:
三原县|
黎平县|
崇左市|
惠安县|
上杭县|
米脂县|
永安市|
阿拉善左旗|
沽源县|
甘孜县|
镇江市|
屯门区|
含山县|
于田县|
龙海市|
大冶市|
松江区|
富裕县|
安图县|
南通市|
桦甸市|
渭源县|
延边|
平利县|
湘乡市|
绥滨县|
毕节市|
平陆县|
日土县|
青州市|
从化市|
阿克苏市|
六盘水市|
革吉县|
渝北区|
五家渠市|
来宾市|
佳木斯市|
定边县|
碌曲县|
建平县|