看了很多文章来介绍 这个问题,想总结一下自己的一些理解
首先先定义一下,
prototype 是原型对象 显性原型 (是一个对象,只有函数对象才有这个属性)
__proto__ 是原型链指向对象 隐性原型 (指向构造函数的 原型对象)
js 一切皆对象的思想
null -> object, Function -> Number, String, Array, RegExp, Boolean -> 实例对象
Object.prototype 是个对象 是万物的始祖 万物始祖的原型链 是null Object.prototype.__proto__ === null
Object.__proto__ 是个函数对象 Object.__proto__ === Function.prototype 函数始祖
Function.prototype 是个函数对象 包装着所有 Function 的一些独有的属性 Function.prototype 是所有函数的始祖
不过他是 这个始祖的 原型链指向的是 万物始祖 也就是 Object.prototye
Function.__proto__ 是个函数对象 Function.__proto__ === Object.__proto__ === Function.prototype
Function.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype 万物始祖
可以说 是 Function 创造的 Object , 但 Function 原型链的原型链,原型的原型链又是指向 Object的原型。
搞清楚 Object ,Function 其他的构造对象,就很easy 了
( Number, String, Array, RegExp, Boolean ).prototype === 都各有各的特性。
( Number, String, Array, RegExp, Boolean ).__proto__ === Function.prototype === Function.__proto__ === 等于函数始祖
自己写的 构造函数,跟上面一样。。
function Person() {}
Person.prototype 是个对象 person : { construction: 指向构造函数本事,__proto__: 始祖对象(Object.prototype) }
Person.__proto__ 是个 函数对象 === Function.prototype 函数的始祖
var xiaoMing = new Person()
xiaoMing.__proto__ === Person.prototype 是个对象。
另一种对象
var xiaoHong = {}
xiaoHong.__proto__ === Object.prototype
看懂上面,应该就差不多哦了。。。