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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("