一张图理解js原型和原型链

本文介绍了JavaScript中的原型和原型链概念,通过一张图帮助理解。提到实例的构造函数属性constructor指向构造函数,每个函数有prototype属性,每个对象有__proto__属性。还解释了Math和JSON对象的原型特性,并探讨了Function.prototype在原型链中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个被问到的问题是:你猜Function._proto_ 是什么?

于是通过博客中转过的一篇博文和js高程学习了原型链并画了张总图,一图了解全部知识

注意:图中的箭头代表等于。

其他基础知识复习部分:

A.原型

1.实例的构造函数属性(constructor)指向构造函数。

person1.constructor == Person

2.每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象

Person.prototype.constructor == Person

 

3.每个对象都有 __proto__ 属性,但只有函数对象才有 prototype 属性

4.原型对象(Person.prototype)是 构造函数(Person)的一个实例。

5.对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:
person1.__proto__ == Person.prototype

6.所有的构造器都来自于Function.prototype,甚至包括根构造器Object及Function自身

7.Math,JSON是以对象形式存在的,无需new。它们的proto是Object.prototype。 

 

 

检验以上内容:

  1. person1.__proto__ 是什么?
  2. Person.__proto__ 是什么?
  3. Person.prototype.__proto__ 是什么?
  4. Object.__proto__ 是什么?
  5. Object.prototype__proto__ 是什么?

难点:

  • Object.__proto__ === Function.prototype // true
    Object 是函数对象,是通过new Function()创建的,所以Object.__proto__指向Function.prototype。(参照第八小节:「所有函数对象的__proto__都指向Function.prototype」)

  • Function.__proto__ === Function.prototype // true
    Function 也是对象函数,也是通过new Function()创建,所以Function.__proto__指向Function.prototype

  Function.prototype.__proto__ === Object.prototype //true

 

至此, 原型链学习完毕。

### JavaScript 原型原型链示意及其工作原理 #### 、JavaScript 中的原型 在 JavaScript 中,`prototype` 是个非常重要的概念。每个函数对象都有个 `prototype` 属性,默认情况下该属性是个普通的对象[^1]。当通过构造函数创建实例时,新实例会自动获得个内部链接(即 `__proto__`),指向构造函数的 `prototype` 对象。 以下是关键点: - **构造函数与原型的关系** 当定义个函数时,JavaScript 自动为其分配了个名为 `prototype` 的属性,并将其初始化为个新的对象。此对象默认包含个 `constructor` 属性,指向原始的构造函数[^3]。 - **实例与原型的关系** 创建的对象实例拥有个隐藏属性 `__proto__`,它实际上是指向构造函数的 `prototype` 对象。这使得实例能够访问到构造函数原型上的方法属性[^4]。 ```javascript function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function () { console.log(`Hello, my name is ${this.name}`); }; const person1 = new Person('Alice', 25); console.log(person1.__proto__ === Person.prototype); // true person1.sayHello(); // Hello, my name is Alice ``` --- #### 二、原型链的工作机制 原型链描述的是多个对象之间的继承关系。如果在个对象上调用某个不存在的方法或属性,则 JavaScript 解析器会在当前对象找不到的情况下沿着 `__proto__` 链向上查找,直到找到目标或者到达最终的 `null`[^2]。 ##### 关键路径解析流程: 1. 如果在当前对象中找到了所需属性/方法,则直接返回结果; 2. 若未找到,则继续沿 `__proto__` 查找父级原型; 3. 这种过程不断重复,直至抵达最顶层——通常是 `Object.prototype` 或者遇到 `null` 结束链条。 下面是一张简化版的解说明: ![Prototype Chain Diagram](https://via.placeholder.com/800x400?text=Prototype+Chain) > 注:由于无法实际绘制像,在这里提供文字化版本解释如下结构树形表示法。 假设存在以下代码片段: ```javascript function A() {} A.prototype.methodA = function() { return 'Method from A'; }; function B() {} B.prototype = Object.create(A.prototype); B.prototype.constructor = B; // 恢复 constructor 正确指针 B.prototype.methodB = function() { return 'Method from B'; }; const bInstance = new B(); bInstance.methodA(); // Method from A bInstance.methodB(); // Method from B ``` 对应的原型链可被描绘成这样的层次架构: ``` bInstance -> B.prototype -> A.prototype -> Object.prototype -> null ``` 每步都代表层继承逻辑,其中每层均可能携带特定功能扩展。 --- #### 三、特殊情况分析 某些内置类型的处理方式稍显独特,比如 `Object.prototype` `Function.prototype` 的关联性值得特别注意[^2]: - 所有的普通对象最终都会回溯至 `Object.prototype`; - 函数本身也是对象的种形式,因此它们同样遵循类似的规则,不过额外具备执行能力以及专属特性如 `.call`, `.apply`. 此外值得注意的点在于,尽管表面上看似乎所有东西都能追溯回去形成闭环,但实际上为了防止无限循环问题,规定了最高级别节点应终止于 `null` 上面结束整个链条走向。 --- ### 总结 综上所述,理解并掌握好 JavaScript 中关于原型原型链的知识对于开发人员来说至关重要。不仅有助于构建更高效的应用程序模型,而且还能有效减少内存消耗提升性能表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值