每个对象都有__proto__属性(前后各两个下划线),用来读取或设置当前对象的原型对象(prototype)
let obj = {};
obj.__proto__ === Object.prototype //true
function fn() {}
typeof fn.prototype //"object" 原型对象也是普通对象
fn.prototype.__proto__ === Object.prototype //true
fn.__proto__ === Function.prototype //true
//构造函数Object()、Function()
Object.__proto__ === Function.prototype //true
Function.__proto__ === Function.prototype //true
总结:
**
普通对象的__proto__属性指向Object.prototype
函数对象的__proto__属性指向Function.prototype
**
特殊情况
typeof Object.prototype //"object"
Object.prototype.__proto__ === null //true
typeof Function.prototype //"function"
Function.prototype.__proto__ === Object.prototype //true
//没有原型的函数(太特殊,看看就行)
Function.prototype.prototype === undefined //true
沿着__proto__属性得到原型链
**
{} ---> Object.prototype ---> null
fn ---> Function.prototype ---> Object.prototype ---> null
Object ---> Function.prototype ---> Object.prototype ---> null
Function ---> Function.prototype ---> Object.prototype ---> null
**
__proto__属性只适用于大部分浏览器,推荐使用Object.getPrototypeOf()替代
let obj = {};
obj.__proto__ === Object.prototype //true
Object.getPrototypeOf(obj) === Object.prototype
function fn() {}
fn.__proto__ === Function.prototype //true
Object.getPrototypeOf(fn) === Function.prototype //true
参考文章:
深入理解javascript原型和闭包(完结)
网道-JavaScript 教程-对象继承
MDN-JavaScript继承与原型链
后话: 本文是学习笔记,方便自己总结记忆,详细原理可查看参考文章。有什么错误的地方,请各位大佬指正。