js原型(__proto__)

607 阅读1分钟

每个对象都有__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继承与原型链

后话: 本文是学习笔记,方便自己总结记忆,详细原理可查看参考文章。有什么错误的地方,请各位大佬指正。