原型和原型链的理解

记住一句话:万物皆对象
对于原型和原型链,我们要知道一下几个:函数对象,实例对象、原型对象

1)函数对象——就是平时称的对象;

2)实例对象——new出的对象或者{ };

3)原型对象——所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的。

一、原型


      原型是一个对象,是函数的一个属性prototype;

      通过该函数实例化出来的对象都可以继承得到原型上的所有属性和方法

      原型对象默认有一个属性constructor ,值为对应的构造函数;另外,有一个属性__proto__,值为Object.prototype

二、原型链


        概念:(1)对象的创建(2)对象的组织结构(3)对象访问成员的规定

 在JavaScript中万物都是对象,对象和对象之间并不是独立存在的,对象和对象之间有一定关系。

        通过对象__proto__属性指向函数的原型对象(函数.prototype)一层一层往上找,直到找到Object的原型对象(Object.prototype)为止,层层继承的链接结构叫做原型链(通过proto属性形成原型的链式结构,专业术语叫做原型链)

三、构造函数  


①构造函数本身也是函数

②构造函数,函数名尽量首字母要大写(为了区分普通函数和构造函数)

③构造函数中的this指向实例化对象

④构造函数需要使用new关键字调用

其中new关键字主要做了?

1.实例化了一个对象:

        eg: var 变量a= new son(1); 变量a表示实例化对象

2.将this指向实例化对象 eg:this—>a

3.将实例化对象的__proto__指向构造函数的原型对象上

4.将属性和方法添加到实例化对象上

         eg:this关键字添加

5.隐式的返回this

示例如下:

四、以上之间的关系
1、这个图很重要:不管代码怎么变,实质性的东西都是图中所发展出来的
我们通过一个图来表示它们之间的联系,后面有相关解析:

 function Str(sprot,prise){
        this.mysprot=sprot;
        this.myprise=prise;
        this.say=function(){
            console.log("实例化对象上的方法");
        }
      }
      var s1=new Str("篮球",20);//实例化对象s1
      var s2=new Str("羽毛球",30);//实例化对象s2


1、我们要谨记一个源头:Function函数对象自动产生第一个对象

2、除Function函数对象之外,所有的函数对象都是由Function函数对象创建的。

3、Function会自动创建出很多函数对象出来

4、Function自动创建的第一个对象是Object对象函数,Function还会自动创建出的函数对象有:Object、window、Date等一系列的内置函数对象,我们自己写的函数对象也是Function创建的。

          其中我们可以根据代码知道:Object和我们自己设定的Show函数都是由Function创建出来的

        注意:Math不是函数对象,是实例对象

5、所有的函数对象都一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建的

6、所有的函数对象中都有一个名字叫prototype的引用类型变量,该引用类型变量是函数对象的成员,它的值是对应的原型对象的引用值,即prototype指向原型对象。

7、所有的原型对象中都有一个名为constructor引用类型变量,该引用类型变量是原型对象的成员,该引用类型变量的值是对应的函数对象的引用值,即constructor指向函数对象

8、实例对象是被对应的函数对象(new出来的那个函数)创建的。

9、所有对象中都有一个名为__proto__的引用类型变量,该引用类型变量是对象的成员

10、Function函数对象中__proto__指向Function原型对象

11、Object函数对象中__proto__值为null。

1、对象中的__proto__的值是哪个对象的引用值?即指向哪个对象?分三种

(1)Function函数对象中的__proto__指向Function原型对象

(2)Object原型对象中__proto__的值为null

(3)除Function函数对象和Object原型对象之外,对象中的__proto__指向~~~谁创建了__proto__所属的对象,就指向谁的原型对象

2、对象访问成员的过程:

1)当前对象中如果有该成员就该到该成员,访问结束;

2)当前对象中如果没有该成员,则到__proto__指向的对象中找到成员,找到就结束,如果没有找到,就继续通过__proto__指向的对象中去找。

一个对象中如果有prototype,则该对象一定是函数对象,如果对象为函数对象,则其中一定有proyotype

一个对象中如果有constructor,则该对象一定有原型对象,如果对象为原型对象,则其中一定有constructor

2、prototype、__proto__、 constructor三者之间的关系
prototype :原型(原型对象)指向的都是原型

__proto__:指向的都是原型

constructor:原型上的属性:指向的是构造函数

①每个对象都有一个隐式的属性(__proto__),属性值本质上就是一个普通的对象

②每个函数对象都有一个原型属性(prototype),属性值本质上就是一个普通的对象

③每个对象的__proto__指向构造函数的原型对象(prototype)

④原型对象上有constrctor属性,指向构造函数

   

  //万物皆对象,实例化也是一个对象,看它是否指向构造函数Str的prototype原型对象,实例化对象是由构造函数创建的console.log(s1.__proto__);//指向str的原型对象console.log(Str.prototype);//指向str的原型对象console.log(s1.__proto__ === Str.prototype);//trueconsole.log(s2.__proto__);//指向str的原型对象console.log(Str.prototype);//指向str的原型对象console.log(s2.__proto__ === Str.prototype);//true//Str也是一个对象,有一个隐式的属性(__proto__),构造函数的原型对象是由Object创建的console.log(Str.prototype.__proto__);//指向Object的原型对象console.log(Object.prototype);//指向Object的原型对象console.log(Str.prototype.__proto__ === Object.prototype);//true//Object也是一个对象,有一个隐式的属性(__proto__),Object的原型对象__proto__ 为nullconsole.log(Object.prototype.__proto__);//null,指向为空


3、实战结论
1、Object的原型对象中的成员,可以所有对象访问,Object是原型链的尽头,Object原型对象通过Object.prototype得到。

        示例:Object.prototype.show(){.......},所有对象就可以访问show函数里面的......。

2、所有的原型对象都是由Object函数对象创建的。

3、new 出的对象是由函数对象创建的。

4、所有的对象中都自带属性__proto__,__proto__指向一个对象

5、Object原型对象中__proto__特殊,它的值为null

6、Function函数对象中__proto__特列,它指向Function原型对象。

7、所有的函数对象中都有prototype属性,原型对象和new 出来的对象中没有

8、prototype总是指向对应的原型对象。

代码如下:

 function Fun(){this.a=1;}Fun.prototype={     //fun的原型对象aa:10,constructor:Fun  //做一个指向,不然后面有关的constructor都为false,可以知道Fun是由Fun构造出来的}var fn1=new Fun();//实例化创建一个新函数,实例化对象为fn1console.log(fn1.aa);  //10console.log(Object.prototype);console.log(Fun.prototype.__proto__);console.log(Object.prototype.__proto__); //null//访问原型有两种方式:一是通过实例方式,二是通过构造函数console.log(fn1.__proto__ === Fun.prototype);//true//Object.prototype是Fun.prototype的父亲,Fun.prototype是fn1.__proto__的父亲//Object.prototype是原型的终点console.log(Object.prototype === fn1.__proto__);//falseconsole.log(Object.prototype === fn1.__proto__.__proto__);//true//等于console.log(Object.prototype === Fun.prototype.__proto__);//实例上的能拿到原型上的属性和方法console.log(Fun.prototype.constructor === Fun);//true(若没有做constructor指向,则为false,没有定义)console.log(fn1.constructor === Fun);//true(若没有做donstructor指向,则为false,没有定义)console.log(Object.prototype.constructor === Object);//true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/154635.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins项目部署

使用jenkins部署项目 简易版使用jenkins部署项目 将war包部署到tomcat中 将已有的war包部署到tomcat中(jenkins与tomcat在同一台主机) 点击Jenkins主页的新建任务 输入任务名称 选择构建一个自由风格的软件项目后点击确定 在构建内添加构建步骤,选择执行shell 输入…

【Android】Android Framework系列---CarPower电源管理

Android Framework系列—CarPower电源管理 智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。这些系统需要由汽车电源进行供电。由于汽车自身的特殊供电环境(相比手机方便的充电环境,汽车的蓄电池如果没有电是需要专业人士操作…

使用 node.js 简单搭建Web服务 使用node简单搭建后端服务 使用node搭建服务

使用 node.js 简单搭建Web服务 使用node简单搭建后端服务 使用node搭建服务 1、初始化项目2、安装 Express.js Web 服务框架3、创建 app.js 主入口文件, 并且实现 GET、POST请求4、启动服务5、请求测试 1、初始化项目 例如项目名为 node-server-demo mkdir node-server-demo进…

GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】

GEO生信数据挖掘(十)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本) 通过 前面十篇文章的学习,我们应该已经可以获取到一个”心仪的基因列表“了,相较于原始基因数量,这个列表的数…

数据结构与算法解析(C语言版)--搭建项目环境

本栏目致力于从0开始使用纯C语言将经典算法转换成能够直接上机运行的程序,以项目的形式详细描述数据存储结构、算法实现和程序运行过程。 参考书目如下: 《数据结构C语言版-严蔚敏》 《数据结构算法解析第2版-高一凡》 软件工具: dev-cpp 搭…

更新电脑显卡驱动的操作方法有哪些?

更新显卡驱动可以有效的提升我们电脑的性能,可以通过设备管理器、显卡驱动软件等方式进行检查驱动是否需要更新,并修复一些电脑上已知的显卡问题。 然而,对于一些不是很懂电脑技术的人员来说,更新电脑显卡驱动是一件比较复杂和混乱…

小红书内容运营包含哪些,内容种草攻略

在这个社交属性,强势泛滥的年代,兼具了社交和电商两大功能的小红书,已经成为品牌方的兵家必争之地。今天来为大家分享下小红书内容运营包含哪些,内容种草攻略! 1、确定账号定位 这是做好小红书内容运营的第一步。一个有…

调试AOSP源码的官方神器-Android Studio for Platform(ASfP)

文章目录 下载安装启动AOSP导入调试不足 欢迎关注微信公众号ZZH的Android 下载 下载地址平台版 Android Studio 由于该工具在调试源码时需要对AOSP进行编译,所以目前只有Ubuntu版本,后续应该也只会有Ubuntu版本。 Ubuntu环境下显示可下载 Windows系统…

linux套接字选项API

获取套接字的选项值(getsockopt) 【头文件】 #include <sys/types.h> #include <sys/socket.h> 【函数原型】 int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen); 【函数功能】 用于获取一个套接字的选项 【参数含义】 […

聊聊统一认证中的四种安全认证协议(干货分享)

大家好&#xff0c;我是陈哈哈。单点登录SSO的出现是为了解决众多企业面临的痛点&#xff0c;场景即用户需要登录N个程序或系统&#xff0c;每个程序与系统都有不同的用户名和密码。在企业发展初期&#xff0c;可能仅仅有几个程序时&#xff0c;管理账户和密码不是一件难事。但…

最优值函数

一、最优状态值函数 解决强化学习任务大致上意味着找到一种政策&#xff0c;能够在长期内实现很多奖励。对于有限MDPs&#xff0c;我们可以精确地定义一种最优政策&#xff0c;其定义如下。值函数定义了政策的一种部分排序。如果一个政策的预期回报大于或等于另一个政策π0在所…

【PC】特殊空投-2023年10月

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧&#xff01;签到活动&#xff0c;每周一次的PUBG空投节&#xff0c;还有可以领取PGC2023免费投票劵的活动等着大家&#xff01;…