總結(jié)
- 函數(shù)都有原型倦卖。
- new P() 出來(lái)的是實(shí)例,實(shí)例沒(méi)有原型蕉斜,是個(gè)P類型的逾柿。
- 而所有的原型其實(shí)類型都是對(duì)象。
- 對(duì)象其實(shí)是個(gè)函數(shù)類型蛛勉。
- 而函數(shù)還是個(gè)函數(shù)類型鹿寻。
- 對(duì)象的原型的原型是null。
關(guān)鍵點(diǎn)
- 函數(shù)即構(gòu)造函數(shù)诽凌,構(gòu)造函數(shù)即函數(shù)
- 函數(shù)都有prototype屬性
-
__proto__
, prototype, constructor的關(guān)系 - 原型的原型是 Object.prototype
- Object.prototype不是任何的實(shí)例
- Function.prototype 是 Object 的實(shí)例
- Object是Function的實(shí)例
- Function是Function的實(shí)例
一張圖看清 構(gòu)造函數(shù)、實(shí)例坦敌、Function 和 Object 的關(guān)系
詳解
1. 函數(shù)即構(gòu)造函數(shù)侣诵,構(gòu)造函數(shù)即函數(shù)
當(dāng)創(chuàng)建了一個(gè)函數(shù)的時(shí)候,就有了這個(gè)函數(shù)的原型對(duì)象
2. 函數(shù)都有prototype屬性
function P() {}
var obj = {}
console.log('P.__proto__', P.__proto__)
console.log('obj.__proto__', obj.__proto__)
console.log('P.prototype', P.prototype)
console.log('obj.prototype', obj.prototype) // 沒(méi)有狱窘,也就是沒(méi)有原型
3. __proto__
, prototype, constructor的關(guān)系
function P() {}
let pp = new P() //pp是P的實(shí)例
// __proto__
console.log(pp.__proto__ == P.prototype) // __proto__ 是用來(lái)指定實(shí)例的原型的
console.log(P.__proto__ == Function.prototype) // 同理P作為一個(gè)函數(shù)杜顺,它是Function的實(shí)例,與pp對(duì)P是一個(gè)意思
// prototype蘸炸,和constructor
// 如上面所說(shuō)躬络,函數(shù)即構(gòu)造函數(shù)有prototype屬性,那么 constructor是用來(lái)指回 構(gòu)造函數(shù)的(這個(gè)如果丟失了搭儒,不會(huì)影響很多穷当,但最好不丟失)
console.log(P.prototype.constructor == P)
4. 原型的原型是 Object.prototype
function P() {}
console.log(P.prototype.__proto__ === Object.prototype)
5. Object.prototype不是任何的實(shí)例
Object.prototype.__proto__ === null
6. Function.prototype 是 Object 的實(shí)例
Function.prototype.__proto__ === Object.prototype
7. Object是Function的實(shí)例
Object.__proto__ === Function.prototype
8. Function是Function的實(shí)例
Function.__proto__ == Function.prototype
9 一個(gè)案例
Object.prototype.aa = 'ooooo'
Function.prototype.aa = 'fffff'
function P() {}
var xx = new P()
console.log(p.aa) //"ooooo"
P.__proto__ === Function.prototype //true
P.prototype.__proto__ === Object.prototype //true
xx.__proto__ === P.prototype //true
xx.__proto__ === Object.prototype //false
var b = {a: 1}
b.__proto__ === Object.prototype //true