JS原型鏈中的prototype和__proto__的區別
阿新 • • 發佈:2019-01-25
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搞起.