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代表父母自己)

目录
相关文章
|
17天前
|
机器学习/深度学习 人工智能 JavaScript
js和JavaScript
js和JavaScript
20 4
|
1月前
|
前端开发 JavaScript 区块链
连接区块链节点的 JavaScript 库 web3.js
连接区块链节点的 JavaScript 库 web3.js
27 2
|
17天前
|
JavaScript 前端开发
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
14 1
|
25天前
|
JavaScript 前端开发
js开发:请解释什么是模块化(modularization),并说明如何在JavaScript中实现模块化。
模块化将复杂系统拆分为松散耦合的模块,提高代码可读性、可维护性、可复用性和可扩展性。JavaScript模块化历经CommonJS(Node.js中常见,使用`require()`和`module.exports`)、AMD(RequireJS,异步加载,`define()`和`require()`)和ES6 Modules(官方标准,`import`和`export`)三个阶段。打包工具如Webpack、Rollup处理兼容性问题,使模块化代码能在各种环境中运行。
|
27天前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
JavaScript中的`this`关键字根据执行上下文指向不同对象:全局作用域中指向全局对象(如`window`),普通函数中默认指向全局对象,但作为对象方法时指向该对象。在构造函数中,`this`指向新实例。箭头函数不绑定`this`,而是继承上下文的`this`值。可通过`call`、`apply`、`bind`方法显式改变`this`指向。
9 2
|
1月前
|
JavaScript 前端开发
在JavaScript中,如何优化原型链的性能?
在JavaScript中,如何优化原型链的性能?
14 2
|
1月前
|
JavaScript 前端开发
谈谈对 JavaScript 中的原型链的理解。
谈谈对 JavaScript 中的原型链的理解。
15 1
|
1月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(下)
深入理解 JavaScript 对象原型,解密原型链之谜(下)
|
1月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(上)
深入理解 JavaScript 对象原型,解密原型链之谜(上)
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句