JS三座大山 —— 原型和原型链

这篇具有很好参考价值的文章主要介绍了JS三座大山 —— 原型和原型链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

内容 链接
2023前端面试笔记 HTML5
2023前端面试笔记 CSS3


前言

理解原型和原型链可以帮助我们更好地理解 JavaScript 中的面向对象编程,实现属性和方法的共享和继承。同时,掌握原型和原型链的知识也是深入学习 JavaScript 的关键。


一、原型是什么?

在 JavaScript 中,每个对象(除了 null 和 undefined)都有一个原型对象(prototype)。原型对象是一个普通的对象,它包含了共享的属性和方法。

现在有1个类A,我想要创建一个类B,这个类B是以类A为原型的,并且能进行扩展。我们称B的原型为A。

  class Student {
    constructor(name, score) {
      this.name = name;
      this.score = score;
    }
    introduce() {
      console.log(`我是${this.name},我考了${this.score}`);
    }
  }
  const student = new Student("张三", 99);

现在有一个Student类,以及它的实例化对象student,当你在student身上使用了它不存在的属性或方法,就会去隐式原型对象__proto__上找
__proto__ =>(指向student实例化对象的原型 => Student类的prototype)
JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

student这个实例化对象身上并没有introduce方法,但是它却能够使用,因为它的隐式原型对象__proto__身上有该方法(__proto__指向的是Student类的显式原型对象)
JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript
student实例化对象的隐式原型对象全等于Student类的显示原型对象
JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript


   function person(name, age) {
     this.name = name;
     this.age = age;
   }
   person.prototype.saying = function () {
     console.log("你好呀,我是person显示原型对象上的saying函数");
   };
   person.prototype.work = "前端开发工程师";
   const p1 = new person("前端百草阁", 21);

JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript
这里把saying方法挂到了p1的原型身上,我们也可以挂到person构造函数的身上,但是这样就会有一个问题,每次调用构造函数时都会为新的对象创建一个新的方法。如果有多个对象实例,它们将各自拥有自己的方法。这可能会导致内存占用增加,因此在一些情况下,将方法定义在构造函数的原型上更为常见和推荐。

   function person(name, age) {
     this.name = name;
     this.age = age;
     this.saying = function () {
       console.log("");
     };
   }
  const p1 = new person("前端百草阁", 21);

JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript


JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

二、原型链是什么?

2.1 原型链全方面解析

就如上图所说,实例自身访问不到的属性或方法,就会往自己的原型身上找(proto
自己的原型找不到就会往原型的原型身上找,直到找到最顶端(Object)

   function person(name, age) {
     this.name = name;
     this.age = age;
   }
   person.prototype.saying = function () {
     console.log("你好呀,我是person显示原型对象上的saying函数");
   };
   person.prototype.work = "前端开发工程师";
   const p1 = new person("前端百草阁", 21);

JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

  class Person {
    constructor(name) {
      this.name = name;
    }
    drink() {
      console.log("每个人都会喝水");
    }
  }
  const person = new Person("普通人");

  class Teacher extends Person {
    constructor(name, subject) {
      super(name);
      this.subject = subject;
    }
    teach() {
      console.log("每个老师都会教书");
    }
  }
  const teacher = new Teacher("哈基米老师", "猫猫课");

在这里的原型链中,如果你对teacher实例化对象使用了drink方法,对象本身是没有drink方法的,但是他可以通过原型链来查找,谁身上具有这个方法,把它拿过来使用
JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

任何一个人都可以使用hasownproperty方法,因为他是原型链顶端Object身上的方法,所有人都可以访问到
如果指定的属性是对象的直接属性——即使值为 null 或者 undefined,hasOwnProperty() 方法也会返回 true。如果属性是继承的,或者根本没有声明该属性,则该方法返回 false。与 in 运算符不同的是,该方法不会在对象原型链中检查指定的属性。
JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

这里附上我自己画的原型链继承图,用图看会清晰很多

JS三座大山 —— 原型和原型链,2023前端面试高频考点,js,原型模式,面试,javascript

Teacher.prototype.__proto__ === Person.prototype // true

2.2 为什么构造函数也有原型?

p1的原型是构造函数,不知道有没有小伙伴和我一样疑惑 对象有自己的原型很正常 为什么构造函数也有自己的原型呢

  • 函数——JavaScript最关键的概念

函数是第一类对象(first-class object),被称为一等公民。函数与对象共存,我们也可以认为函数就是其他任意类的对象。由此可见,对象有的功能,函数也会拥有

函数也是对象,唯一不同的地方在于,函数是可以调用的(invokable),也就是说函数会被调用以便执行某些动作。


总结

综上所述,构造函数通过 prototype 属性指向原型对象,原型对象包含了共享的属性和方法,而对象实例通过原型链(__proto__属性指向原型对象)继承了原型对象的属性和方法。通过 constructor 属性,我们可以追溯到对象实例的构造函数。这些概念共同构成了 JavaScript 中的原型继承机制文章来源地址https://www.toymoban.com/news/detail-690323.html

到了这里,关于JS三座大山 —— 原型和原型链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023前端面经(面试准备+面试题)

    1.1 博客粉丝少,要不要写简历上 博客粉丝数量少,文章内容都是基础的东西,要不要写到简历上?咨询了一些群友,以下是一些回复: 1.“我作为面试官,拿到的简历如果有自己建立的站点或者博客的链接我会点进去看看的,另外面试过程中,也会去问一两点。所以我建议

    2024年02月09日
    浏览(33)
  • 2023前端面试题汇总

    今天想把近期看的面试题汇总一下,项目空档期,看的面试题比较多,但没有整理,导致回忆的时候,想不起来的还要重新查找。包括身边朋友面试遇到的题目也总结了进去。 总结的都是前端基础(初级)面试题。 三月份我会持续更新~~~ 浅卷一下下 2023.03.09开始——3.15——

    2023年04月13日
    浏览(38)
  • 2023前端面试题二

    png 无损压缩,尺寸体积要比jpg的大,适合做小图标 jpg 采用压缩算法,有一点失真,比png体积要小,适合做中大图片 gif 一般是做动图的 webp 同时支持有损或者无损压缩,相同质量的图片,webp具有更小的体积 标准盒子模型 margin/border/padding/content ie盒子模型 margin/content(border+

    2024年02月02日
    浏览(31)
  • 2023前端面试题一

    空元素 块级元素 行内元素

    2024年02月02日
    浏览(35)
  • 2023常见前端面试题

    以下是一些2023年秋招常见的前端面试题及其答案: 1. 请解释一下什么是前端开发? 前端开发是指使用HTML、CSS和JavaScript等技术来构建网页和用户界面的过程。前端开发人员负责将设计师提供的 视觉设计转化为可交互的网页 ,并确保网页在不同设备上的良好显示和响应。

    2024年02月11日
    浏览(38)
  • 【面试题】2023前端vue面试题及答案

    前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库  web前端面试题库 VS java后端面试题库大全   Vue3.0 为什么要用 proxy? 在 Vue2 中, 0bject.defineProperty 会改变原始数据,而 Proxy 是创建对象的虚拟表示,并提供 set 、get 和 deleteProperty 等处理器,这些处理器可

    2024年02月06日
    浏览(38)
  • 2023年大厂前端面试题汇总

    一、58同城前端面试题27道 1. css盒模型 2. css画三角形 3. 盒子水平垂直居中(所有方式) 4. 重绘、重排 重绘就是重新绘制(repaint):是在一个元素的外观被改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。 重排就是重新排列(reflow):

    2024年02月12日
    浏览(28)
  • 2023.07.07面试偏前端angular

    ==和===是JavaScript中的两个比较运算符,用于比较两个值的相等性。 ==是松散相等运算符,它会进行类型转换后再比较值是否相等。如果两个值的类型不同,==会尝试将它们转换为相同的类型,然后再进行比较。例如,1 == \\\'1\\\'会返回true,因为它们在进行比较之前会被转换为相同

    2024年02月13日
    浏览(29)
  • 2023前端面试笔记 —— HTML5

    内容 链接 2023前端面试笔记 HTML5 HTML5作为最新的HTML标准,为前端开发带来了许多新的特性和功能。在前端面试中,HTML5的知识和应用已经成为了必备的技能。本篇文章将总结HTML5的 重要知识点和常见面试题 ,帮助读者更好地准备前端面试,提升自己的竞争力。 HTML 超文本标记

    2024年02月11日
    浏览(42)
  • 2023 最新前端面试题 (HTML 篇)

    src 用于替换当前元素 (引入) ,href 用于在当前文档和引用资源之间确立联系 (引用) (1)src(source) 指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置; 在请求 src 资源时会将其指向的资源下载并应用到文档内,例如 js 脚本,img 图片和 frame 等元素

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包