从事前端这么久,发现原型和原型链一直都是云里雾里,网上看了好多文章、博客也还是不怎么明朗,相信被它困扰的小伙伴,不在少数
以下是我总结的原型和原型链,个人认为是比较浅显易懂的:
原型:构造函数中的 prototype 就是显示原型

一、首先大家在对JS原型进行解释的时候,会涉及两个概念:构造函数、原型对象

  1. 构造函数:通俗的一句话说,就是你在script标签里面声明的函数:
function Person(params) {/**我就是构造函数*/}
  1. 原型对象:当我们创建了一个函数A,浏览器就会在内存中创建一个对象B——即函数A的原型对象,并且每个函数都默认有一个prototype属性指向了内存中的对象,(即prototype的属性就是这个对象),而原型对象B默认有一个constructor属性指向了这个函数A(即constructor属性的值是函数A)

二、使用构造函数创建对象

当我们把函数作为一个构造函数使用new关键字来创建对象的时候:

function Person(params) {/**我就是构造函数*/}var p1 = new Person();

对象p1构造函数Person创建出来之后,对象p1和构造函数Person已经没有任何关系了,此时p1对象中会存在一个默认不可见的属性[[prototype]] ,指向了构造函数Person的原型对象
[[prototype]]是不可访问的,但是一些浏览器也提供了对这个属性的访问,比如:Chrome和火狐浏览器,ie不支持
访问方式:p1.__proto__

注意p1是没有prototype属性的,prototype属性只在构造函数(Person)中存在


由图可知,p1的__proto__属性指向的是构造函数的原型对象!
这里我们用一个图来再次梳理一下构造函数、原型对象和构造对象三者之间的关系:

说明:

  1. 创建p1虽然使用的是Person构造函数,但创建完成后对象p1已经和构造函数Person没有关系了,对象p1的__proto__属性指向的是构造函数的原型对象
  2. 如果使用 构造函数new Person()创建多个对象p1,p2,p3…,则多个对象同时指向Person构造函数的原型对象
  3. 当我们手动给这个原型对象添加属性和方法Person.prototype.name='小明',那么p1,p2,p3…这些对象就会共享这些在原型中添加的属性和方法
  4. 如果我们访问p1中的一个属性name,如果在p1对象中找到,则直接返回,如果没有,则直接去p1对象的__proto__属性指向的原型对象中找,如果找到则返回。(如果原型中也没找到,则继续向上找原型的原型——原型链。后面讲)
  5. 通过p1对象只能读取原型中的name属性值,不能修改name的值。p1.name='张三'并不是修改了原型中的值,而是给p1对象添加了一个属性name。
  6. 如果通过p1对象添加了一个属性name(p1.name='张三'),则对p1来说就屏蔽了原型中的属性name,即p1中无法访问到原型的name属性了

下面看详细代码:

        function Person(params) {// 我就是构造函数}// 可以使用Person.prototype 直接访问到原型对象Person.prototype.name="小明" // 给函数Person的原型对象添加属性name,值为'张三'Person.prototype.age = 18/*** 访问p1对象的属性name,虽然p1中没有添加name属性,但p1对象__proto__指向的原型对象中有name属性,所以能访问到属性name*/var p1 = new Person();console.log(p1.name) //小明var p2 = new Person()console.log(p2.name) //小明p1.name='张三' // 由于不能修改原型中的值,所以这种方法只是在p1中添加了一个新属性name,然后在p1中就无法访问到原型中的name属性了console.log(p1.name) //张三console.log(p2.name) //小明

三、与原型有关的几个属性和方法

1. prototype属性
prototype存在于构造函数中(其实任意函数中都有,只是不是构造函数的时候prototype我们不关注而已),它指向了这个构造函数的原型对象
2.constructor属性
constructor属性存在于原型对象中,它指向了构造函数

 function Person(params) {// 我就是构造函数}console.log(Person.prototype.constructor===Person) //true

3. __proto__ 属性(注意:左右各是2个下划线)
用构造方法创建一个新的对象之后,这个对象中默认会有一个不可访问的属性 [[prototype]] , 这个属性就指向了构造方法的原型对象。

​ 但是在个别浏览器中,也提供了对这个属性[[prototype]]的访问(chrome浏览器和火狐浏览器。ie浏览器不支持)。访问方式:p1.__proto__

​ 但是开发者尽量不要用这种方式去访问,因为操作不慎会改变这个对象的继承原型链

参考文章:https://blog.csdn.net/u012468376/article/details/53121081

JavaScript什么是原型和原型链JS相关推荐

  1. web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步

    系列文章目录 JavaScript 知识梳理,收录了web前端面试 95%以上 的高频考点,满满的干货.给你做一个高效的知识梳理,为你的面试保驾护航! 内容 参考链接 HTML & CSS 篇 ...

  2. 进击的 JavaScript 之(七) 原型链

    原文链接:周大侠啊 进击的 JavaScript (七) 之 原型链 算是记录一下自己的学习心得吧,哈哈 首先说一下,函数创建的相关知识 在JavaScript中,我们创建一个函数A(就是声明一个函数 ...

  3. 浅谈JS原型与原型链(一)

    最近学习JavaScript原型与原型链的时候,被这块知识烧得脑壳疼,prototype与__proto__混淆不清.网上各种图解,都画的好复杂,绕老绕去,不明所以,看得越来越糊涂.还是亲自动手敲敲, ...

  4. JS原型与原型链终极详解

     一. 普通对象与函数对象   JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 functi ...

  5. JavaScript对象——原型与原型链

    原型与原型链 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 va ...

  6. 深入理解JavaScript系列(5):强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...

  7. 关于javascript的原型和原型链,看我就够了(二)

    温故 创建对象的三种方式 通过对象直接量 通过new创建对象 通过Object.create() js中对象分为两种 函数对象 普通对象 仔细观察如下代码 function Foo(name) {th ...

  8. 最详细的讲解 JS 原型与原型链

    文章目录 一. 普通对象与函数对象 二. 构造函数 三. 原型对象 四. proto 五. 构造器 六. 原型链 七. Prototype 总结 一. 普通对象与函数对象 JavaScript 中,万 ...

  9. 【前端芝士树】Javascript的原型与原型链

    [前端芝士树]Javascript的原型.原型链以及继承机制 前端的面试中经常会遇到这个问题,自己也是一直似懂非懂,趁这个机会整理一下 0. 为什么会出现原型和原型链的概念 1994年,网景公司(Ne ...

最新文章

  1. 涉及位操作的算法辑录
  2. 倒频谱原理与python实现
  3. mybatis解决属性名和数据列名不一致
  4. jquery验证手机号码和邮箱地址例子
  5. Nginx----实现https站点
  6. matlab读取时间数据,Matlab有关数据库读取及时间项的设定
  7. Linux文件类型及颜色标识整理
  8. 创建和使用约束Constraint
  9. 【vijos】P1190 繁忙的都市
  10. 纯软件归档产品的好处
  11. Excel单页导出以及多sheet导出
  12. 影响宝宝脾胃健康的3个“真凶”,难怪孩子脾胃总是调不好!
  13. 腾讯云cdn怎样接入域名
  14. 批量给多个 Excel 工作薄文件中插入新的工作表 Sheet
  15. WiFi、GNSS定位服务实战-OneOS位置服务组件(文末有礼品)
  16. Android pda出入库管理,WMS+PDA扫描出入库管理系统
  17. JQuery - 反向选择器
  18. c++STL 一级、二级空间配置器
  19. 盘点8款流行的网红纱帘,以及它们的特点 - 江南爱窗帘十大品牌
  20. 几个留待认真研究的问题,开源tt

热门文章

  1. 怎样更换vivoy31s锁屏壁纸(2021教程分享)
  2. dom4j修改带有命名空间的xml文件
  3. 网友疯狂吐槽奇葩面试经历
  4. 剖析生态创新样本长沙银行:一半是金融,一半是科技
  5. 神经网络与深度学习简史
  6. 读《任何阅读一本书HOW TO READ A BOOK》之读书笔记
  7. 【ssh】工作原理、sshpass超详细介绍
  8. win10更新后自带Microsoft Edge浏览器主页无法锁定解决
  9. 阿里云IoT平台CoAP接入
  10. 100天精通Python(基础篇)——第32天:日志logging模块基础+代码实战