在Javascript中,萬物皆對象,但對像也有區別,大致可以分為兩類,即:普通對象Object 和 函數對象Function。
一般而言,透過new Function產生的物件是函數對象,其他物件都是普通物件。
範例說明:
#1 ##2 |
# #17 18
1920
#21
function f1 (){ //todo }
var
f2 = function(){ //todo
}; var f3 = newFunction(
'x'
#, 'console.log(x)');
# var o1 = {} ; var o2 = #new Object();
var o3 = new f1();
console.log(
typeoff1, //function
#typeoff2, //function
typeoff3, ######### ######typeof### ###o1,#####//object######## ##### ######typeof### ###o2,######//object########### #######type########## #######type########### #######type## # ###o3 ######//object############);####### //function>> function function function object object object
|
1#23 | function f(){} f.prototype.foo = "abc" #; console.log(f.foo); #//undefined |
##1
2
3
4
|
#function f(){} f.prototype.foo = "abc" ;
var #obj = new f();
console.log(obj.foo); #/ /abc
|
現在我們知道,obj中__proto__保存的是f的prototype, 那麼f的prototype中的__proto__中保存的是什麼呢? 看下圖:
如圖所示,f.prototype的__proto__中保存的是Object.prototype,Object.prototype物件中也有__proto__,而從輸出結果看,Object. prototype.__proto__ 是null,表示obj物件原型鏈的終結。如下圖所示:
obj物件擁有這樣一個原型鏈以後,當obj.foo執行時,obj會先查找自身是否有該屬性,但不會查找自己的prototype,當找不到foo時,obj就沿著原型鏈依次去查找...
在上面的例子中,我們在f的prototype上定義了foo屬性,這時obj就會在原型鏈上找到這個屬性並執行。
最後,用幾句話總結本文中涉及到的重點:
原型鏈的形成真正是靠__proto__ 而非prototype,當JS引擎執行物件的方法時,先查找物件本身是否存在該方法,如果不存在,會在原型鏈上查找,但不會查找自身的prototype。
一個物件的__proto__記錄著自己的原型鏈,決定了自身的資料類型,改變__proto__就等於改變物件的資料類型。
函數的prototype不屬於自身的原型鏈,它是子類別創建的核心,決定了子類別的資料類型,是連接子類別原型鏈的橋樑。
在原型物件上定義方法和屬性的目的是為了被子類別繼承和使用。
以上是js中什麼是原型物件和原型鏈的詳細內容。更多資訊請關注PHP中文網其他相關文章!