持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
上一篇文章,简单的叙述了一下原型,我们得知,查找属性的顺序是
对象本身 - 对象的原型对象 - 对象原型对象的原型对象
一直循环下去,直到找到最顶层的原型对象为止,这个链条被称为原型链
举个栗子
let obj = {
name: 'kaka'
}
// 先直接找一个它自己没有的属性
console.log(obj.age)
// 在它的原型上挂载一个age
obj.__proto__.age = 22
console.log(obj.age)
最顶层的原型对象
大家一定很好奇,既然是个链条,那么函数和对象的原型是什么呢
- 对象中是一个object对象
- 函数中是一个function
let obj = {
name: 'kaka'
}
function foo() {
}
console.log(foo.prototype)
console.log(foo.__proto__)
Object的原型
事实上,不管是对象还是函数,它们原型链的尽头都是Object的原型,也称之为顶层原型,我们可以打印看看这个顶层原型长什么样。
console.log(Object.prototype)
我们再来验证下Object的原型的原型看看有没有东西呢
console.log(Object.prototype.prototype)
可以看出来它是个undefined,说明object的原型是最顶层的原型了,实际上函数和对象的最终指向都是它
做个总结吧
- 从Object的原型可以得出一个结论“原型链最顶层的原型对象就是Object的原型对象”,这也就是为什么所有的对象都可以调用它的公共方法了,如toString和pareInt方法了;