【前端面试系列】封装 继承 多态

封装(Encapsulation)

什么是封装?

封装是面向对象编程的核心概念之一,它具有两个主要特点:

  1. 将数据和操作数据的方法绑定在一起,形成一个独立的单元
  2. 实现信息隐藏,控制对对象内部数据的访问

封装的实现方式

JavaScript中实现封装主要有以下几种方式:

1. 使用闭包实现私有属性和方法
function Person(name) {// 私有属性let _name = name;// 私有方法function _validateAge(age) {return age > 0 && age < 150;}// 公共方法this.getName = function() {return _name;};this.setName = function(newName) {_name = newName;};
}const person = new Person('张三');
console.log(person.getName()); // 输出:张三
console.log(person._name); // 输出:undefined
2. 使用Symbol实现私有属性
const nameSymbol = Symbol('name');class Person {constructor(name) {this[nameSymbol] = name;}getName() {return this[nameSymbol];}
}
3. 使用私有类字段(最新提案)
class Person {#name; // 私有字段声明constructor(name) {this.#name = name;}getName() {return this.#name;}
}

相关面试题

Q1: 什么是封装?为什么需要封装?

A: 封装是将数据和操作数据的方法捆绑在一起,并对外部隐藏实现细节的一种机制。封装的必要性:

  1. 提高代码的安全性,防止外部直接访问和修改对象内部数据
  2. 降低代码的耦合度,便于维护和修改
  3. 提供更好的代码重用性

Q2: JavaScript中如何实现私有属性和方法?

A: JavaScript中实现私有成员主要有以下几种方式:

  1. 闭包:利用函数作用域创建私有变量和方法
  2. Symbol:使用Symbol作为属性键,实现伪私有属性
  3. 命名约定:使用下划线前缀(_)表示私有成员(约定俗成)
  4. 私有类字段:使用#前缀声明真正的私有字段(新特性)

继承(Inheritance)

继承的实现方式

1. 原型链继承
function Parent() {this.name = 'parent';
}Parent.prototype.getName = function() {return this.name;
};function Child() {Parent.call(this);this.type = 'child';
}// 建立继承关系
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
2. Class继承(推荐)
class Parent {constructor(name) {this.name = name;}getName() {return this.name;}
}class Child extends Parent {constructor(name, type) {super(name);this.type = type;}getType() {return this.type;}
}

相关面试题

Q1: 原型链继承和class继承有什么区别?

A: 主要区别:

  1. 语法:class继承更清晰简洁,原型链继承较为复杂
  2. 构造函数:class必须先调用super(),原型链中使用Parent.call(this)
  3. 继承链:class继承会同时继承静态和实例属性方法,原型链继承只能继承实例属性方法
  4. 性能:class继承在现代引擎中可能有更好的优化

多态(Polymorphism)

多态的实现方式

1. 方法重写
class Animal {makeSound() {return '动物发出声音';}
}class Dog extends Animal {makeSound() {return '汪汪汪';}
}class Cat extends Animal {makeSound() {return '喵喵喵';}
}// 多态的使用
function animalSound(animal) {console.log(animal.makeSound());
}const dog = new Dog();
const cat = new Cat();animalSound(dog); // 输出:汪汪汪
animalSound(cat); // 输出:喵喵喵

相关面试题

Q1: JavaScript中如何实现多态?

A: JavaScript中实现多态主要通过以下方式:

  1. 方法重写:子类重写父类的方法
  2. 接口模拟:虽然JS没有接口,但可以通过约定来模拟接口
  3. 鸭子类型:关注对象的行为而不是类型

Q2: 什么是鸭子类型?

A: 鸭子类型是一种动态类型的概念,如果一个对象具有特定的方法和属性,我们就认为它是某种类型,而不关心它实际上是什么类型。例如:

function makeObjectSpeak(obj) {if (typeof obj.speak === 'function') {obj.speak(); // 只要对象有speak方法就可以调用}
}

总之,JavaScript中可以通过对象、构造函数和类来实现封装、继承和多态这些面向对象编程的核心概念。不同的语法和机制可以用来达到相同的目标,你可以根据项目需求和个人偏好来选择适合你的方式。

写在最后

感谢您花时间阅读这篇文章! 🙏

如果您觉得文章对您有帮助,欢迎:

  • 关注我的技术博客:徐白知识星球 📚
  • 关注微信公众号:徐白知识星球

我会持续输出高质量的前端技术文章,分享实战经验和技术心得。

共同成长

  • 欢迎在评论区留言交流
  • 有问题随时后台私信
  • 定期举办技术分享会
  • 更多精彩内容持续更新中…

让我们一起在技术的道路上携手前行! 💪

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

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

相关文章

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

Java项目实战II基于Spring Boot的高校教师电子名片系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在信息化教育日益普及的今天&#xff0…

数学几百年重大错误:将无穷多各异直线误为直线y=x

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 直线Z&#xff1a;x-y0&#xff08;x的变域是x轴&#xff09;可放大&#xff08;拉伸&#xff09;变换为直线L&#xff08;不≌Z…

学习threejs,使用第一视角控制器FirstPersonControls控制相机

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️第一视角控制器FirstPerson…

LabVIEW导入并显示CAD DXF文件图形 程序见附件

LabVIEW导入并显示CAD DXF文件图形 程序见附件 LabVIEW导入并显示CAD DXF文件图形 程序见附件 - 北京瀚文网星科技有限公司 LabVIEW广泛应用于自动化、数据采集、图形显示等领域。对于涉及CAD图形的应用&#xff0c;LabVIEW也提供了一些方法来导入和显示CAD DXF文件&#x…

数据结构---详解栈

一、栈的概念和结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&a…

Python Plotly 库使用教程

Python Plotly 库使用教程 引言 数据可视化是数据分析中至关重要的一部分&#xff0c;它能够帮助我们更直观地理解数据、发现潜在的模式和趋势。Python 提供了多种数据可视化库&#xff0c;其中 Plotly 是一个功能强大且灵活的库&#xff0c;支持交互式图表的创建。与静态图表…

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…

Dubbo源码解析(三)

一、Dubbo整合Spring启动流程 Dubbo的使用可以不依赖Spring&#xff0c;但是生产环境中Dubbo都是整合到Spring中一起使用&#xff0c;所以本章就解析Dubbo整合Spring的启动流程 一、传统的xml解析方式 一、Dubbo配置解析流程 在Java 中&#xff0c;一切皆对象。在JDK 中使用…

【ubuntu】Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件&#xff0c; 目前已经覆盖了&#xff0c; windows&#xff0c;android&#xff0c; mac, linux 等操作系统。 Ubuntu 现状 Ubuntu 自带应用市场 Ubuntu 自带应用市场目前只有 Geogebra 4.0 版本&#xff0c; 不能画立…

Qt 编写插件plugin,支持接口定义信号

https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级&#xff0c;在编写插件的基础上&#xff0c;支持接口类定义信号。 环境&#xff1a;Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…

MFC工控项目实例二十九主对话框调用子对话框设定参数值

在主对话框调用子对话框设定参数值&#xff0c;使用theApp变量实现。 子对话框各参数变量 CString m_strTypeName; CString m_strBrand; CString m_strRemark; double m_edit_min; double m_edit_max; double m_edit_time2; double …

x-cmd pkg | lf - 轻量级终端文件管理器,开销低,效率高,适合资源受限的环境

目录 简介快速上手安装使用 技术特点竞品和相关项目进一步阅读 简介 lf&#xff08;list files&#xff09;是 github.com/gokcehan 用 Go 开发的轻量级终端文件管理器&#xff0c;能提供一个通过键盘快捷键进行文件浏览、操作和管理的方法。它的界面风格和操作模式类似于 ran…

D64【python 接口自动化学习】- python基础之数据库

day64 SQL-DQL-基础查询 学习日期&#xff1a;20241110 学习目标&#xff1a;MySQL数据库-- 133 SQL-DQL-基础查询 学习笔记&#xff1a; 基础数据查询 基础数据查询-过滤 总结 基础查询的语法&#xff1a;select 字段列表|* from 表过滤查询的语法&#xff1a;select 字段…

力士乐工控机触摸屏面板维修CFG-BTV40.BN

力士乐工控机触摸屏维修包括BTV20系列&#xff0c;BTV30系列&#xff0c;BTV40等系列均可提供维修服务。 力士乐工控机维修&#xff0c;先区分故障是来自小信号处理部分&#xff0c;还是功率部分故障&#xff0c;很多设备的上位机会有所提示。处理部分包括i/o端口&#xff0c;…

数据挖掘全景:从基础理论到经典算法的深度探索

1 绪论--1.1 数据挖掘的概念和任务 1. (单选题)目前数据分析与挖掘领域的现实情况描述不正确的是&#xff08;&#xff09; A. 信息爆炸 B. 数据爆炸 C. 信息贫瘠 D.数据收集能力远远超过人们的分析和理解能力 2. (单选题)你认为下面哪种数据对于数据挖掘算法来说最简单最…

简易入手《SOM神经网络》的本质与原理

原创文章&#xff0c;转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》&#xff1a; 本网结构化讲解神经网络的知识&#xff0c;原理和代码。 重现matlab神经网络工具箱的算法&#xff0c;是学习神经网络的好助手。 目录 一、入门原理解说 01.…

ubuntu 安装kafka-eagle

上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群 /root/efak 目录 cd /root/efak tar -zxvf kafka-eagle-bin-2.0.8.tar.gz cd /root/efak/kafka-eagle-bin-2.0.8 mkdir /root/efakmodule tar -zxvf efak-web-2.0.8-bin.tar.gz -C /root/efakmodule/ mv /root/efakmodule/efak…

小程序服务商常见问题

1: 服务器域名和开发域名都不带https前缀, 业务域名每个都需要校验文件 2: 手机开了调试可以请求, 关闭调试无法请求, 体验版接口请求不同 答: 服务商还需要通过接口给小程序设置业务域名; 但不需要校验文件; 注意: 体验版通过快速配置小程序服务器域名接口会不生效, 用普通的 …

Llama架构及代码详解

Llama的框架图如图&#xff1a; 源码中含有大量分布式训练相关的代码&#xff0c;读起来比较晦涩难懂&#xff0c;所以我们对llama自顶向下进行了解析及复现&#xff0c;我们对其划分成三层&#xff0c;分别是顶层、中层、和底层&#xff0c;如下&#xff1a; Llama的整体组成…