javaScript中原型和原型链的分析深究 —————— 开开开山怪

2024-02-07 07:48

本文主要是介绍javaScript中原型和原型链的分析深究 —————— 开开开山怪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

javaScript中原型和原型链的分析深究

建议阅读的时候配合第二幅图来阅读,可能会更清晰

1.原型与原型链的概念

原型: [prototype属性表示类与类之间的父子关系] 原型事实上是每个 函数或类 都拥有的一个 prototype 属性,这个属性事实上是一个指针,指向一个原型对象(原型对象是object,因为是对象,所有拥有__proto__属性),这个原型对象让我来说就是类或函数自己拥有的一种性质一样,但是这个性质可能包含父类的性质(父类的prototype属性所指向的空间)。prototype属性,表示了类与类之间的父子关系,子类可以拥有父类的性质,
原型链: [__proto__属性表示是某类的对象] 原型链是每个对象实例都拥有的一个__proto__ 属性,__proto__作为内部属性,在浏览器显示为灰色的prototype,__proto__属性同样也是一个指针,指向从属类或函数的原型对象,对象的__proto__属性和它从属类的prototype属性指向同一空间。

我自身认为,不管一个类,函数或一个对象想要拥有别人的性质,有两条路可以走,一是拥有prototype属性,表示了类与类之间的父子关系,子类可以拥有父类的性质。二是拥有__proto__属性,表示了是某个类的对象,拥有从属类的性质,如果对象想访问从属类的某些性质,就可以通过__proto__进行访问。如果没有必要访问也可以不访问。

为了验证接下来我所说的一系列的原型和原型链以及function,Function,object,Object,之间的关系.

先给出一个名字为point的function函数。

function point(row, col) {this.setRow = function(row) {this.row = row ? row : 1;}this.setCol = function(col) {this.col = col ? col : 1;} this.getRow = function() {return this.row;}this.getCol = function() {return this.col;}this.setRow(row);this.setCol(col);
}var point1 = new point(2, 1);
var Function1 = new Function();
var Object1 = new Object();

function Function object Object 拥有的属性

  1. function : prototype属性 _ proto _属性
  2. Function: prototype属性 _ proto _属性
  3. object: _ proto _属性
  4. Object: prototype属性 _ proto _属性

知道了function Function Object 拥有的属性之后,我可以更好的解释原型和原型链了。
point1 是上边代码给出的通过new point得到的一个对象,只有__proto__属性。
point 是一个实实在在的function函数。point拥有 prototype属性 和__proto__属性

这个图解释原型和原型链
在这里插入图片描述
这个图虽然解释了开始说的原型和原型链的关系,但同时又有新的问题产生。
1.object的原型链指向谁??,
2.function的原型链指向谁??
4.Functiont和Object的关系是什么?
5.谁是整个链的终结者?

那么经过小查同学的不懈努力,终于有了结果。
在这里插入图片描述根据上图我们来做问题的一一解答
1.因为point1是个对象,并且point1是通过new point产生的,point本身是个function函数,这同时也说明了function是个类,通过new function可以产生一个对象,因为上面我说过prototype属性所指向的空间相当于自己拥有的性质,并且function的prototype属性指向的原型是一个对象,为什么说function的prototype指向的是一个object对象呢,原因是对象只有__proto__属性(原型链),并且这个object对象的__proto__属性(原型链)指向的是Object的prototype所指向的空间。足以说明object是Object类的对象。
并且所有的函数或类的prototype属性所指向的空间都是一个object对象,这个object对象不一定相同,但这些object都是Object类的对象,因为object对象的__proto__属性(原型链)指向了Object的prototype属性所指向的空间。
结果经验证:

console.log("point instanceof Object :", point instanceof Object);           // 结果为true
console.log("point.prototype instanceof Object", point.prototype instanceof Object);        //结果为true
console.log("Function.prototype instanceof Object", Function.prototype instanceof Object);  //结果为true

2.第一问回答已经证明了function不仅是函数,同样也是一个类,是Object的子类。从我画的图可以看出function的__proto__属性(原型链)指向了Function的prototype属性所指的空间,我说过原型链指明了是某个类的对象,这表明function还是Function的对象,所以function有多重身份,函数,类,对象。但我可以确定的是function不是Object的对象,只是Object的一个子类。其实上边也说过了prototype属性表示类与类之间的父子关系,同时也经验证 new Object所产生的对象只拥有__proto__属性,而没有prototype属性。
而function两个属性都拥有。并且 new Function所产生的对象也确实拥有这两个属性。所以更加的确定。

3.Function和Object的关系解释起来可能有些复杂,我采用一个人性化的例子来说明

Object像父亲 Object是对象,是类
Function像母亲 Function是函数,是对象,是类

Object (父亲)拥有自己的一套教育孩子的准则,并且这个准则是独一无二并且是最终,这个准则就是自己的prototype 所指向的__proto__为null的这个object,Function(母亲) 也有自己的一套教育孩子的准则,这个准则就是自己的prototype属性所指向的那个object对象,但是这个object对象的__proto__最终指向了Object (父亲)的教育准则,说明母亲的准则是基于父亲的独一无二的准则,但同时也添加了自己的想法,最终形成自己的准则。这同时说明了Function 是 Object的子类。

Function(母亲) 的__Proto__属性指向自己的prototype属性所指向的空间,这说明Function(母亲)有自己的准则(prototype属性所指向的空间) 了,不用再采纳别人的意见(表明Function不是任何人的对象,也不用通过__proto__属性去访问别人的性质)此时的这个别人的意见就是Function的__proto__属性所指向的空间。所以此事Function(母亲)的__proto__属性指向的是自己的prototype属性所指向的空间,Function自己是自己的对象。

而Object (父亲)不一样,即使自己拥有独一无二的教育准则(Function 的 prototype属性指向的空间),但是还要采纳母亲的准则,所以Object的__proto__属性指向了Function的prototype所指向的空间。这也说明了Object是Function的对象

console.log("Object instanceof Function :", Object instanceof Function);     //结果为true
console.log("Function instanceof Object :", Function instanceof Object);     //结果为true
console.log("Function instanceof Function :", Function instanceof Function); //结果为true
console.log("Object instanceof Object :", Object instanceof Object);         //结果为true

4.链的终结者当然是Object的prototype属性所指向的空间,也就是父亲的独一无二的教育准则。

这篇关于javaScript中原型和原型链的分析深究 —————— 开开开山怪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/687020

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插