js中类的继承--extends

2024-04-21 21:36
文章标签 js 继承 extends 中类

本文主要是介绍js中类的继承--extends,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是类的继承

创建类继承,需要使用 extends关键字。

使用类继承创建的类继承了另一个类的所有方法
官网代码示例

class Car {constructor(brand) {this.carname = brand;}present() {return 'I have a ' + this.carname;}
}class Model extends Car {constructor(brand, mod) {super(brand);this.model = mod;}show() {return this.present() + ', it is a ' + this.model;}
}let myCar = new Model("Ford", "Mustang");
document.getElementById("demo").innerHTML = myCar.show();

在Model的构造方法中我们看到了super(),通过在 constructor 方法中调用 super() 方法,我们调用了父级的 constructor 方法获得了父级的属性和方法的访问权限

继承对于代码可重用性很有用:在创建新类时重用现有类的属性和方法。

getter和setter的实现

如需在类中添加 getter 和 setter,需使用 get set 关键字。
注意:即使 getter 是一个方法,当你想要获取属性值时也不要使用括号。
getter/setter 方法的名称不能属性名称相同,许多程序员在属性名称前使用下划线字符 _ 将 getter/setter 与实际属性分开:

class Car {constructor(brand) {this._carname = brand;}get carname() {return this._carname;}set carname(x) {this._carname = x;}
}let myCar = new Car("Ford");
myCar.carname = "Volvo";//直接通过.访问
document.getElementById("demo").innerHTML = myCar.carname;

区别 优势
getter和setter提供了更多的优势和灵活性:

封装(Encapsulation):通过getter和setter,可以隐藏内部实现细节,只暴露必要的接口。这有助于保护对象内部状态的完整性,并允许开发者更改属性的内部结构而不影响到类的使用者。

计算属性(Computed Properties):getter可以用来返回一个计算值,而不仅仅是存储的值。这意味着你可以根据对象的其他属性动态计算属性值。

验证和控制(Validation and Control):setter可以允许你在属性值被设置前进行验证或转换,确保对象处于有效状态,或者执行相关的副作用。

懒加载(Lazy Loading):可以利用getter实现属性值的懒加载,即只有在首次访问时才计算属性值,然后将其缓存起来。

日志和调试(Logging and Debugging):如果需要跟踪属性的访问或修改,getter和setter是很好的切入点来添加日志记录逻辑。
例子

class Person {constructor(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;// fullName 直接作为属性存在,但没有额外逻辑this.fullName = `${firstName} ${lastName}`;}
}const person = new Person('John', 'Doe');// 直接访问fullName属性
console.log(person.fullName); // 输出:John Doe// 尝试直接更新fullName属性
person.fullName = 'Jane Smith';// 由于我们没有在设置fullName时更新firstName和lastName,所以这里还是原来的值
console.log(person.fullName); // 输出:Jane Smith
console.log(person.firstName); // 输出:John
console.log(person.lastName); // 输出:Doe

在这个例子中,fullName 是作为一个普通属性存在的,当fullName被直接设置时,并不会影响firstName和lastName的值,反之亦然。这说明了为什么可能需要getter和setter来同步更新相关联的属性值。

总的来说,尽管getter和setter不是必须的,但它们提供了一种更强大、可控的方式来管理对象属性的访问和修改。

Hoisting

与函数和其他 JavaScript 声明不同,类声明不会被提升。

这意味着必须先声明类,然后才能使用它:

/您还不能使用该类。
//myCar = new Car("Ford")
//This would raise an error.class Car {constructor(brand) {this.carname = brand;}
}//现在您可以使用该类:
let myCar = new Car("Ford")

对于其他声明,如函数,在声明之前尝试使用它时不会出错,因为 JavaScript 声明的默认行为是提升(将声明移到顶部)。

super()

让我们把super()说的更加详细一些
super据我目前理解,有两个作用:
1.调用父类的构造函数
2.为父类的构造函数传参

如果父类的构造函数需要参数并且没有为这些参数提供默认值,但是你在子类中调用 super() 时没有传递任何参数,这将导致运行时错误。更具体地说,它会抛出一个 TypeError,因为父类期望得到一些参数,而实际上没有收到。

下面是一个示例来展示这种情况:

class Parent {constructor(a, b) {// 父类构造函数需要两个参数this.a = a;this.b = b;}
}class Child extends Parent {constructor() {super(); // 调用父类构造函数但不传递任何参数// 子类特有的初始化代码...}
}// 尝试创建Child类的实例
const myChild = new Child();

这样在调用父类构造函数的时候就会发生问题
解决这个问题通常有两个方法:

  • 修改父类构造函数,为其参数提供默认值。
比如 constructor(length, width, height, track_id = undefined) {}
这是es6的一个新特性,此处在没有传入参数时候,默认为undefined
  • 在子类中调用 super() 时确保传递所有必需的参数。

如果无法修改父类或者确实不想在子类中使用父类的初始化逻辑,那么可能需要重新考虑是否应该使用继承,或者寻找其他设计模式(例如组合)来满足需求了。

这篇关于js中类的继承--extends的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924087

相关文章

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

js react 笔记 2

起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块const { randomUUID } = require('crypto');const uuid = randomUUID();console.log(uuid); // 输出类似 '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'