当前位置: 首页 > news >正文

一天时间迅速准备前端面试|JS基础—原型和原型链【三座大山之一,必考】

六年代码两茫茫,不思量,自难忘
6年资深前端主管一枚,只分享技术干货,项目实战经验,面试指导
关注博主不迷路~

在这里插入图片描述
本系列文章是博主精心整理的面试热点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速建立前端面试知识体系。抓住每一场面试的机会,知己知彼才能百战百胜。
希望各位同学收藏起来哦!!

  • 上期回顾 JS基础–变量类型和计算
  • 本系列订阅 面试指导专栏

文章目录

  • 本期介绍
  • 主要内容
  • 关键字
    • 如何用 class 实现继承
      • class
      • 继承
    • 如何理解 JS 原型(隐式原型和显示原型)
    • instanceof 是基于原型链实现的
    • JS 原型相关的面试题


本期介绍

本期介绍原型、原型链和 class。包括 class ,继承,原型,原型链,instanceof。原型是 “JS 三座大山” 之一,原型和原型链也是必考知识点。

主要内容

  • 如何用 class 实现继承
  • 如何理解 JS 原型(隐式原型和显示原型)
  • instanceof 是基于原型链实现的
  • JS 原型相关的面试题

关键字

  • 原型
  • 原型链
  • instanceof
  • class
  • 继承

如何用 class 实现继承

//语法结构
class 首字母大写 {
 //构建
  constructor(参数1,参数2){

  }
}

class

class的本质仍然是函数(其实是ES6的语法糖)

  • constructor
  • 属性
  • 方法

继承

es6的继承本质上是原型链 + 盗用构造函数

  • extends(继承)
  • super(执行父类构造函数)
  • 扩展或重写方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • class是面向对象的一个语法的实现
  • class相当于一个模板,可以通过这个模板去构建一些东西,用constructor构建器构建
  • 可以用constructor去复制他的属性和方法

如何理解 JS 原型(隐式原型和显示原型)

  1. JS原型
    每个class都有显式原型 prototype
    每个class实例化后都有隐式原型 proto
    实例的隐式原型指向对应class的显式原型

  2. instanceof可以判断引用类型
    比如Object是People的父类,People是Student的父类

  3. class类具有定义的属性和方法,也有显示原型prototype,而将这个class类实例化就有了隐式原型_proto_,也就是 Shilihua.proto === Student.prototype
    在这里插入图片描述
    此原型图解可对照上面class 实现继承定义的类理解
    在这里插入图片描述
    在这里插入图片描述

instanceof 是基于原型链实现的

原型链:

  • 每个构造函数都有 prototype(显式原型)
  • 每个实例对象都有 proto / [[prototype]](隐式原型)
  • 实例对象的__proto__ (隐式原型) 指向构造函数的 prototype(显式原型)

执行规则:

  • 获取实例对象的属性或方法时
  • 先在自身属性和方法寻找
  • 若找不到则自动通过原型链一层一层向上查找
    在这里插入图片描述
    此原型链图解可对照上面class 实现继承定义的类理解
class People {
    eat() {}
}
class Student extends People {
    sayHi() {}
}
const xialuo = new Student(name, number);

// 实例对象隐式原型指向构造函数显式原型
xiaoluo.__proto__ === Student.prototype // true 
Student.prototype.__proto__ === People.prototype // true
People.prototype.__proto__ === Object.prototype // true

// Object原型对象的隐式原型为null 所以null即原型链的顶端
Object.prototype.__proto__ === null // true

// 原型链
xiaoluo.__proto__ -> 
Student.prototype.__proto__ -> 
People.prototype.__proto__ -> 
Object_prototype.__proto__ ->
null

instanceof:

  • 是基于原型链实现的
  • 用于检测构造函数的显式原型是否出现在某个实例对象的原型链上

JS 原型相关的面试题

  1. 如何判断一个变量是不是数组?
    使用instanceof/Array.isArray方法
  2. 手写jquery
class jQuery {
    constructor(selector) {
        const result = document.querySelectorAll(selector)
        const length = result.length
        for (let i = 0; i < length; i++) {
            this[i] = result[i]
        }
        this.length = length
        this.selector = selector
    }
    get(index) {
        return this[index]
    }
    each(fn) {
        for (let i = 0; i < this.length; i++) {
            const elem = this[i]
            fn(elem)
        }
    }
    on(type, fn) {
        return this.each(elem => {
            elem.addEventListener(type, fn, false)
        })
    }
    // 扩展很多 DOM API
}

// 插件
jQuery.prototype.dialog = function (info) {
    alert(info)
}

// “造轮子”
class myJQuery extends jQuery {
    constructor(selector) {
        super(selector)
    }
    // 扩展自己的方法
    addClass(className) {

    }
    style(data) {

    }
}

// const $p = new jQuery('p')
// $p.get(1)
// $p.each((elem) => console.log(elem.nodeName))
// $p.on('click', () => alert('clicked'))

插件机制就是用 prototype 来对原型进行补充加强
造轮子就是用 extends 继承,然后新建自己的新方法

✨原 创 不 易 , 还 希 望 各 位 支 持
👍 点 赞 , 你 的 认 可 是 我 创 作 的 动 力
⭐️ 收 藏 , 你 的 青 睐 是 我 努 力 的 方 向
✏️ 评 论 , 你 的 意 见 是 我 进 步 的 财 富

相关文章:

  • Spring Security详细讲解(JWT+SpringSecurity登入案例)
  • 【Network】网络基础@应用层 —— 协议 | http | https
  • UGUI学习笔记(九)自制3D轮播图
  • R统计-单因素ANOVA/Kruskal-Wallis置换检验
  • 动态开点线段树(C++实现)
  • pytorch保存和加载模型权重以及CUDA在pytorch中的使用
  • UDF提权(mysql)
  • linux内核漏洞(CVE-2022-0847)
  • kubekey 离线部署 kubesphere v3.3.0
  • Git史上最详细教程(详细图解)
  • Python科学计算库练习题
  • 高性能MySQL实战第10讲:搭建稳固的MySQL运维体系
  • java毕业设计茶叶企业管理系统Mybatis+系统+数据库+调试部署
  • JAVA安装教程 (windows)
  • 6.hadoop文件数据库系列讲解
  • 345-反转字符串中的元音字母
  • 77. Combinations
  • C++类中的特殊成员函数
  • MySQL-事务管理(基础)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node和express搭建代理服务器(源码)
  • php ci框架整合银盛支付
  • Ruby 2.x 源代码分析:扩展 概述
  • vue-cli3搭建项目
  • 初识 beanstalkd
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何设计一个比特币钱包服务
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用agvtool更改app version/build
  • 用Visual Studio开发以太坊智能合约
  • 中文输入法与React文本输入框的问题与解决方案
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)Elastix图像配准:3D图像
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)为什么要选择C++
  • (转)EXC_BREAKPOINT僵尸错误
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Framework .NET Core与 .NET 的区别
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖