p.constructor === Person // function Person () {}
p.constructor === Person.prototype.constructor // function Person () {}
p.__proto__ === Person.prototype // {say: function () {}}
p.__proto__ === p.constructor.prototype // {say: function () {}}
p.__proto__.__proto__ === Person.prototype.__proto__ === Object.prototype
对于函数对象:
var f = new Function()
f.__proto__ === Function.prototype // function () {}
f.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype
注意:
当我们重写原型对象,而不是修改原型对象时:
function Ghost () {}
Ghost.prototype = {} // 直接赋值一个对象
var g = new Ghost()
g.__proto__ === Ghost.prototype
g.__proto__ !== g.constructor.prototype
g.__proto__ === Object.prototype
JavaScript中万物皆是对象,且对象细分为
普通对象
和函数对象
。凡是通过
new Function()
创建的均为函数对象
,如Object
、Function
、Number
、Boolean
、String
、Array
、RegExp
等等,其余都是普通对象
。函数对象
的__proto__
均指向Function.prototype
,且为空函数function () {}
。普通对象
的__proto__
均指向该对象构造函数
的prototype
。Function.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ = null
对于普通对象:
Person
相当于是构造函数,p
是Person
的实例,并且继承p
的原型p.__proto__
,即Person.prototype
的所有属性。当然,
Person
本身也是函数对象,这里我们考虑的是Person
的实例p
。对于函数对象:
注意:
当我们重写原型对象,而不是修改原型对象时:
这时,
g.constructor
指向的是Object
,可以通过指定constructor
避免这种情况:本文参考最详尽的 JS 原型与原型链终极详解,没有「可能是」进行总结,感谢原作者。