总结
- 函数都有原型。
- new P() 出来的是实例,实例没有原型,是个P类型的。
- 而所有的原型其实类型都是对象。
- 对象其实是个函数类型。
- 而函数还是个函数类型。
- 对象的原型的原型是null。
关键点
- 函数即构造函数,构造函数即函数
- 函数都有prototype属性
-
__proto__
, prototype, constructor的关系 - 原型的原型是 Object.prototype
- Object.prototype不是任何的实例
- Function.prototype 是 Object 的实例
- Object是Function的实例
- Function是Function的实例
详解
1. 函数即构造函数,构造函数即函数
当创建了一个函数的时候,就有了这个函数的原型对象
2. 函数都有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) // 没有,也就是没有原型
3. __proto__
, prototype, constructor的关系
function P() {}
let pp = new P() //pp是P的实例
// __proto__
console.log(pp.__proto__ == P.prototype) // __proto__ 是用来指定实例的原型的
console.log(P.__proto__ == Function.prototype) // 同理P作为一个函数,它是Function的实例,与pp对P是一个意思
// prototype,和constructor
// 如上面所说,函数即构造函数有prototype属性,那么 constructor是用来指回 构造函数的(这个如果丢失了,不会影响很多,但最好不丢失)
console.log(P.prototype.constructor == P)
4. 原型的原型是 Object.prototype
function P() {}
console.log(P.prototype.__proto__ === Object.prototype)
5. Object.prototype不是任何的实例
Object.prototype.__proto__ === null
6. Function.prototype 是 Object 的实例
Function.prototype.__proto__ === Object.prototype
7. Object是Function的实例
Object.__proto__ === Function.prototype
8. Function是Function的实例
Function.__proto__ == Function.prototype
9 一个案例
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