JS 继承之谜:究竟有哪些神秘方法?Web 前端开发者必知的关键技巧待你揭开谜底!

简介: 【8月更文挑战第23天】JavaScript (JS) 是 Web 前端开发的关键语言,其中继承是面向对象编程的重要概念。本文探讨了 JS 中几种继承机制:原型链继承、构造函数继承及组合继承。原型链继承利用原型对象实现属性和方法的共享;构造函数继承通过在子类构造器内调用父类构造器实现私有属性的复制;组合继承结合两者优点,既支持属性共享又避免了属性被意外覆盖的风险。理解这些模式有助于开发者更高效地组织代码结构,提升程序质量。

在 Web 前端开发中,JavaScript(JS)是一门至关重要的编程语言。而继承作为面向对象编程中的一个重要概念,在 JS 中也有多种实现方法。

首先,我们来谈谈原型链继承。这是 JS 中最基本的继承方式。每个函数都有一个 prototype 属性,它指向一个对象,这个对象被称为原型对象。当创建一个函数的实例时,该实例会自动拥有一个指向函数原型对象的指针。通过这种方式,可以实现属性和方法的继承。

下面是一个原型链继承的示例代码:

function Parent() {
   
  this.name = 'parent';
}

Parent.prototype.sayHello = function() {
   
  console.log('Hello from parent');
};

function Child() {
   }

Child.prototype = new Parent();

const child = new Child();
console.log(child.name); // 'parent'
child.sayHello(); // 'Hello from parent'

在这个例子中,Child 的原型被设置为一个 Parent 的实例,这样 Child 的实例就可以访问 Parent 的属性和方法。

然而,原型链继承也有一些缺点。其中一个问题是,如果在子类型的构造函数中不小心覆盖了父类型的属性,可能会导致一些意外的结果。另外,原型链继承中的引用类型属性会被所有实例共享,这可能不是我们期望的行为。

接下来,我们看看构造函数继承。这种方法通过在子类型的构造函数中调用父类型的构造函数来实现继承。

以下是构造函数继承的示例代码:

function Parent(name) {
   
  this.name = name;
}

function Child(name) {
   
  Parent.call(this, name);
}

const child = new Child('child');
console.log(child.name); // 'child'

在这个例子中,通过在 Child 的构造函数中调用 Parent.call(this, name),将 Parent 的属性复制到了 Child 的实例中。这样,每个 Child 的实例都有自己独立的属性,不会出现原型链继承中引用类型属性被共享的问题。

但是,构造函数继承也有不足之处。它只能继承父类型的实例属性和方法,不能继承父类型原型上的属性和方法。

为了解决这个问题,可以结合使用原型链继承和构造函数继承,这就是组合继承。

组合继承的示例代码如下:

function Parent(name) {
   
  this.name = name;
}

Parent.prototype.sayHello = function() {
   
  console.log('Hello from parent');
};

function Child(name) {
   
  Parent.call(this, name);
}

Child.prototype = new Parent();
Child.prototype.constructor = Child;

const child = new Child('child');
console.log(child.name); // 'child'
child.sayHello(); // 'Hello from parent'

在这个例子中,首先在 Child 的构造函数中调用 Parent.call(this, name),实现对父类型实例属性的继承。然后,将 Child 的原型设置为一个 Parent 的实例,实现对父类型原型属性和方法的继承。最后,将 Child.prototype.constructor 重新指向 Child,以确保正确的构造函数标识。

除了以上三种方法,还有寄生组合式继承等其他继承方式。每种方法都有其优缺点,在实际开发中,我们可以根据具体情况选择合适的继承方式。

总之,JS 中的继承方法为我们提供了强大的工具,可以更好地组织和管理代码,提高代码的可维护性和可扩展性。了解这些继承方法,对于成为一名优秀的 Web 前端开发者至关重要。

相关文章
|
18小时前
|
存储 前端开发 JavaScript
WEB前端开发中如何实现大文件上传?
WEB前端开发中如何实现大文件上传?
12 3
WEB前端开发中如何实现大文件上传?
|
17小时前
|
设计模式 JavaScript 前端开发
浅谈JavaScript 框架在现代 Web 开发中的作用
浅谈JavaScript 框架在现代 Web 开发中的作用
20 12
|
1天前
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
10 2
|
2天前
|
JavaScript 前端开发
JS几种拼接字符串的方法
JS几种拼接字符串的方法
11 1
|
2天前
|
JavaScript 前端开发 索引
JS 删除数组元素( 5种方法 )
JS 删除数组元素( 5种方法 )
8 1
|
2天前
|
JavaScript 前端开发 安全
JavaScript实现跳转的方法
JavaScript实现跳转的方法
7 0
|
2天前
|
JavaScript 前端开发 开发者
使用 Vue.js 和 Vuex 构建响应式前端应用
【10月更文挑战第2天】使用 Vue.js 和 Vuex 构建响应式前端应用
8 0
|
2天前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
2天前
|
Web App开发 缓存 前端开发
前端RAG:使用Transformers.js手搓纯网页版RAG(二)- 基于qwen1.5-0.5B
本文继续探讨了RAG的后半部分,通过在浏览器中运行qwen1.5-0.5B模型实现了增强搜索全流程。然而,由于浏览器与模型性能限制,该方案更适合研究、离线及高隐私场景。文章提供了完整的前端代码,让读者能够动手尝试。此外,详细介绍了代码框架、知识库准备、模型初始化及问答实现等步骤,并展示了实际运行效果。受限于当前技术,除非在离线或高隐私环境下,网页大模型的应用仍需进一步优化。
11 0
|
2天前
|
存储 自然语言处理 文字识别
纯前端RAG:使用Transformers.js实现纯网页版RAG(一)
本文将分两部分教大家如何在网页中实现一个RAG系统,本文聚焦于深度搜索功能。通过浏览器端本地执行模型,可实现文本相似度计算和问答匹配,无需依赖服务器。RAG搜索基于高维向量空间,即使不完全匹配也能找到意义相近的结果。文中详细介绍了如何构建知识库、初始化配置、向量存储及相似度计算,并展示了实际应用效果。适用于列表搜索、功能导航、文档查询及表单填写等多种场景。
11 0