从事前端这么久,发现原型和原型链一直都是云里雾里,网上看了好多文章、博客也还是不怎么明朗,相信被它困扰的小伙伴,不在少数
以下是我总结的原型和原型链,个人认为是比较浅显易懂的:
原型:构造函数中的 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. hdfs 数据迁移_基于JindoFS+OSS构建高效数据湖
  2. 第一册:lesson seventeen。
  3. 材料成型计算机模拟第三版,材料成型计算机模拟实验报告模板学习.doc
  4. AspNetCore 中使用 InentityServer4(2)
  5. linux如何查看桌面环境变量,如何设置和查看Linux系统的环境变量
  6. 使用 Windows Sysinternals 工具进行故障排除
  7. 笑喷!小区封闭男子将头伸出围栏外理发:又好笑又心酸
  8. 安装网站+服务器连接失败,为什么我都安装完成后是服务器连接失败啊
  9. Expanding Rods(二分)
  10. linux 如何查看 块设备_理解Linux操作系统中的块设备
  11. HackerRank数据库题目练习(2)
  12. Win1909+vs2019+Windows 10 WDK 2004(10.0.19041.1) + Windows 10 SDK 2004(10.0.19041.1)环境搭建
  13. 线性代数:切线空间和法向量变换
  14. tf.app.flags
  15. Tipask,Tipask建站,Tipask插件
  16. Python异常UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
  17. 【转】解决win10系统每次重启桌面图标排列混乱的问题!亲测有效!!
  18. postgresql整理
  19. HTML5页面背景切换
  20. 【XR】VR手柄定位技术

热门文章

  1. 基于HTML+CSS+JS实现七夕情人节表白代码【含代码】
  2. 电子计算机辩论稿,桂林电子科技大学计算机系辩论队
  3. 关于Navicat 报错1251连接不成功Mysql
  4. 10个Python爬虫框架推荐,你使用的是哪个呢?
  5. MySQL外键之级联
  6. mysql外键设置方式
  7. ai人工智能市场客户_投资管理中的人工智能可提升客户关系和回报
  8. 微信摇心愿如何选不同服务器,微信摇心愿几率如何?非酋玩家实测皮肤概率,20分钟摇到嘻哈皮肤...
  9. uniapp苹果无法上架_uni-app开发小程序适配苹果端采坑总结
  10. 哈尔滨金融学院计算机系宿舍,哈尔滨金融学院宿舍怎么样