JS查漏补缺——JavaScript的原型链

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解JavaScript的原型链

JavaScript原型链

从一个对象上获取属性,如果在当前对象中没有获取到就会去它的原型(__proto__)上面获取([get]操作)
var obj = {
    a: 1
}
// 原型链
obj.__proto__ = {
}
obj.__proto__.__proto__ = {
  b:2
}
console.log(obj.b) // 会沿着原型链依次往下找
那如果里面没有这个属性呢,这样不就会一直找下去了吗?
不会的,Object的原型链也是有尽头的

原型链的尽头——[Object: null prototype] {}

但我们打印 Object.__proto__的日志的时候发现控制台打印出[Object: null prototype] {} ,就可以知道已经找到原型链的尽头了,再 console.log(Object.__proto__.__proto__)控制台就会打印null

例1:有我们想要找的属性

var obj = {
    a: 1
}
// 原型链
obj.__proto__ = {
}
obj.__proto__.__proto__ = {
  b:2
}
console.log(obj.b) // 会沿着原型链依次往下找
// 这个例子原型链的尽头
console.log(obj.__proto__.__proto__.__proto__) //[Object: null prototype] {}
console.log(obj.__proto__.__proto__.__proto__.__proto__)//null

例2:没有我们想要找的属性

var obj = {
    a: 1
}

obj.__proto__ = {
}
console.log(obj.b) //undefined
console.log(obj.__proto__) //{}
console.log(obj.__proto__.__proto__) //[Object: null prototype] {}

总结:我们没有往obj的原型[__proto__]上额外去添加属性,那么它下一个原型[__proto__]就是原型链的尽头——[Object: null prototype] {}

例3:对于构造函数的原型链

function Person() {
 
}

console.log(Person.prototype.__proto__) //[Object: null prototype] {}
console.log(Person.prototype.__proto__.__proto__) //null

Snipaste_2022-09-23_23-10-27.png
[Object: null prototype] {} 原型有什么特殊吗?

  • 特殊一:该对象有原型属性,但是它的原型属性已经指向的是null,也就是已经是顶层原型了;
  • 特殊二:该对象上有很多默认的属性和方法;

扩:__proto__和prototype的区别(更加详细的可去看上篇文章的内容)

本来是没有__proto__这个东西的,是浏览器加的,就是为了让你能找到一个实例的构造函数的原型

__proto__代表指针和prototype代表主体,prototype.__proto__指向下一个prototype
(例:__proto__指向父母,prototype代表父母自己)

目录
相关文章
|
21天前
|
前端开发 JavaScript 区块链
连接区块链节点的 JavaScript 库 web3.js
连接区块链节点的 JavaScript 库 web3.js
|
1月前
|
JavaScript 前端开发 Go
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
152 1
|
2天前
|
移动开发 JavaScript 前端开发
Phaser和Three.js是两个非常流行的JavaScript游戏框架,它们各自拥有独特的核心功能和使用场景
【6月更文挑战第16天】Phaser是开源的2D游戏引擎,适合HTML5游戏,提供物理引擎、图像渲染和资源管理,适用于2D游戏,如消消乐。Three.js是基于WebGL的3D库,用于创建复杂的3D场景和应用,涵盖从游戏到可视化领域的多种用途。两者分别在2D和3D开发中展现强大功能,选择取决于项目需求。
16 8
|
3天前
|
缓存 JavaScript 前端开发
js/javascript获取时间戳的5种方法
js/javascript获取时间戳的5种方法
|
6天前
|
JavaScript 前端开发 开发者
JavaScript基础-JS输出与变量声明
【6月更文挑战第11天】本文介绍了JavaScript基础的输出和变量声明,包括`console.log`的使用及常见错误,如忘记调用和输出复杂数据结构。此外,文章讲解了`var`、`let`和`const`的差异,强调了`const`的引用不变性以及在何时选择使用`let`和`const`。通过理解这些基础知识和避免常见问题,初学者能更好地进行代码调试和编写。
|
15天前
|
前端开发 JavaScript API
Vue.js:渐进式JavaScript框架-前端开发
Vue.js:渐进式JavaScript框架-前端开发
21 3
|
25天前
|
JavaScript 前端开发
JavaScript-jQuery的使用 + JS的案例
JavaScript-jQuery的使用 + JS的案例
24 0
|
28天前
|
JavaScript 前端开发
前端 JS 经典:原型和原型链
前端 JS 经典:原型和原型链
22 0
|
1月前
|
前端开发 JavaScript
前端 js 经典:原型对象和原型链
前端 js 经典:原型对象和原型链
27 1
|
4天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的校园竞赛管理系统附带文章源码部署视频讲解等
151 63