1. 程式人生 > >JS原型鏈中的prototype和__proto__的區別

JS原型鏈中的prototype和__proto__的區別

複製程式碼複製程式碼
 1             function Fun(){
 2             }
 3 //            我創造了一個函式Fn
 4 //            這個函式由Function生成(Function作為建構函式)
 5             var fn=new Fun()
 6 //            我建立了一個函式fn
 7 //            這個函式由Fn生成(Fn作為建構函式)
 8             
 9             
10             console.log(fn.__proto__===Fun.prototype)    //true
11 //            fn的__proto__指向其建構函式Fun的prototype
12             console.log(Fun.__proto__===Function.prototype)        //true
13 //            Fun的__proto__指向其建構函式Function的prototype
14             console.log(Function.__proto__===Function.prototype)    //true
15 //            Function的__proto__指向其建構函式Function的prototype
16 //            建構函式自身是一個函式,他是被自身構造的
17             console.log(Function.prototype.__proto__===Object.prototype)    //true
18 //            Function.prototype的__proto__指向其建構函式Object的prototype
19 //            Function.prototype是一個物件,同樣是一個方法,方法是函式,所以它必須有自己的建構函式也就是Object
20             console.log(Fun.prototype.__proto__===Object.prototype)         //true
21 //             與上條相同
22 //             此處可以知道一點,所有建構函式的的prototype方法的__都指向__Object.prototype(除了....Object.prototype自身)
23             console.log(Object.__proto__===Function.prototype)        //true
24 //            Object作為一個建構函式(是一個函式物件!!函式物件!!),所以他的__proto__指向Function.prototype
25             console.log(Object.prototype.__proto__===null)        //true
26 //            Object.prototype作為一切的源頭,他的__proto__是null
27 
28 //            下面是一個新的,額外的例子
29 
30             var obj={}
31 //            建立了一個obj
32             console.log(obj.__proto__===Object.prototype)        //true
33 //            obj作為一個直接以字面量建立的物件,所以obj__proto__直接指向了Object.prototype,而不需要經過Function了!!
34 
35 //            下面是根據原型鏈延伸的內容
36 //            還有一個上文並未提到的constructor,  constructor在原型鏈中,是作為物件prototypr的一個屬性存在的,它指向建構函式(由於主要講原型鏈,這個就沒在意、);
37 
38             console.log(obj.__proto__.__proto__===null)        //true
39             console.log(obj.__proto__.constructor===Object)        //true
40             console.log(obj.__proto__.constructor.__proto__===Function.prototype)        //true
41             console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype)    //true    
42             console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null)        //true
43             console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype)    //true
44             
45             
46 //            以上,有興趣的可以一一驗證  F12搞起.
         
複製程式碼複製程式碼