0

0

js中关于原型链与继承的理解

一个新手

一个新手

发布时间:2017-09-09 11:38:48

|

1484人浏览过

|

来源于php中文网

原创

js中的原型链是比较难理解的一部分知识,而继承又是依赖于原型链,所以原型链是我们必须去掌握的。在学习原型链之前,我们需要去介绍一下原型。建议这部分重在理解,不推荐死记硬背。


1、原型

js中只有函数对象才有原型,原型也是个对象。例如,我们创建一个save函数,通过typeof来查看其类型,返回值是”object”,说明其实一个对象。

                                     图1 函数对象
那么,函数的原型包含哪些内容呢?通过打印输出,我们可以看到,其原型包含两部分,一是constructor,二是proto。我们首先了解下constructor,后文会介绍proto
这里写图片描述
图2 函数对象的原型
学过java的都知道constructor是构造器的意思,其包含有关构造器的一些信息,比如参数、调用者等。
前面说过只有函数对象才有原型,那么普通对象有没有呢?下面通过实例验证,通过save构造出一个对象fileSave。
这里写图片描述
图3 普通对象
从上面的例子看出,普通对象是没有原型的,但是其有proto属性。
小结:从以上分析,我们学到函数对象有原型属性,普通对象没有原型属性。

2、原型链

原型链的实现是依赖proto属性的,其可以理解为C语言中的指针,java中的引用。在js中,proto指向的是什么呢?还是抛出实例,下面通过打印输出fileSave的proto属性:
这里写图片描述
图4 对象的proto
你是不是有所发现,fileSave的proto值和图2中的save函数对象的prototype一样,即proto指向save的原型。我们知道fileSave对象是通过new save();创建的,故我们得出结论fileSave的proto指向其构造函数对象的原型。为了验证结果,我们再次通过save创建一个对象imageSave,看一下它的proto属性值。
这里写图片描述
我们再次发现,imageSave的proto指向了save的原型。因此,我们可以知道对象的proto指向其构造函数的原型。那么,save也是一个对象,它的prto应该指向它的构造函数的原型,即Function的原型。
这里写图片描述
另外,我们从第一节知道原型也是对象,其proto属性的指向又是如何呢?以实例说话,下面打印出save.prototype.proto值。
这里写图片描述
图5 save.prototype.proto
从图5知,save.prototype.proto的值是Object的原型。我们很好奇,Obejct.prototype 的proto的值,打印出来看看。
这里写图片描述
是null,可以理解,毕竟其实最顶层的对象啦。
从上面的分析得出下面的链图:
这里写图片描述
图6 原型链
小结:通过这一节的分析,我们学到原型链的实现是依靠对象的proto属性。如果通过函数对象创建一个对象,那么该对象的proto属性就指向其构造函数的原型。
3、继承
在讲继承之前,我们先来学习下属性的查找。在js中,其会按照原型链去查找属性,如果自己没有,就根据proto属性依次往上找。下面我们,先写一段实例代码。

英特尔AI工具
英特尔AI工具

英特尔AI与机器学习解决方案

下载
save.fileName = "oo"save.prototype.fileName = "lili";fileSave.fileName = "haha";

这里写图片描述
这时我们如果打印fileSave.fileName的值,很明显得到的是“haha”。但是如果我把fileSave.fileName = “haha”;去掉,再次打印会输出什么呢?
这里写图片描述
从打印结果,我们知道会根据proto属性中去找fileName属性,即根据图5的链图去查询需要的属性。在这里,如果没有save.prototype.fileName = “lili”;这段赋值代码,打印出来的就是undefined,因为原型链中没有对应的属性。有人可能会说,为啥不会输出“oo”,的确从代码中看到save.fileName = “oo”这段赋值代码,但是我们需要知道save是个函数对象,当执行这段代码时,finName会在constructor下,并不在原型中,类似于java中的静态属性(在这里不能通过实例对象访问)。
记住:通过普通对象调用属性,该查找只会在prototype的属性中查找,并不会在constructor中查找。如果在save的原型中没有找到,又会到save.proto中查找,依次进行下去。
如果知道属性查找方式,那么实现继承就很简单了。例如我们创建一个空对象saveDisk,如果我想访问save中的fileName,我们只需要把saveDisk的proto的值等于save的原型即可(简单理解为把两条不相干的铁链接在一起)。

saveDisk._proto_ = save.prototype

这里写图片描述

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号