关于原型链的特殊情况的几条总结:
- Object并不是原型链顶层,
Object.prototype
才是原型链的顶层,有:Object.prototype.__proto__
=null
- 所有函数都是Function的实例(包括Function),有:
Function.prototype
=Function.__proto__
- 所有对象都是Object的实例(包括原型对象),有:
Function.prototype.__proto__
=Object.prototype
测试题1
var A = function() {}
A.prototype.n = 1
var b = new A()
A.prototype = {
n: 2,
m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m) // 1 undefined 2 3
测试题2
var F = function() {}
Object.prototype.a = function() {
console.log('a()')
}
Function.prototype.b = function() {
console.log('b()')
}
var f = new F()
f.a() // a()
f.b() // b is not a function(报错)
F.a() // a()
F.b() // b()
注:
Object.prototype.constructor.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
Object.prototype.__proto__ === null // true
构造函数的原型继承的Function, Function继承的是Object, 意思就是Object的prototype就是尽头了