javascript学习笔记(十) js对象 继承

yizhihongxing

下面是“javascript学习笔记(十) js对象 继承”的攻略。

一、对象的基础知识

在JavaScript中,对象是一种键-值对的数据结构。而对象的键和值通常称作属性和方法。我们可以使用对象字面量定义一个简单的对象,如下所示:

var person = {
  name: 'Jack',
  age: 20,
  sayHi: function() {
    console.log('Hi, I am ' + this.name);
  }
};

上述代码中,我们定义了一个名为person的对象,它包含了nameagesayHi三个属性。其中,sayHi属性是一个函数,我们可以使用person.sayHi()来调用它,输出Hi, I am Jack

二、JS继承的概念

面向对象程序设计(OOP)的核心概念之一是继承,其基本思想是利用已有的类创建新的类。这里提一下,JavaScript中的继承是基于原型的继承,而非基于类的继承。

在JavaScript中,每个对象都有一个原型对象,它决定了该对象的属性和方法。当我们访问一个对象的属性或方法时,如果该对象本身不存在该属性或方法,JavaScript会尝试从它的原型对象中寻找,如果还是找不到,则会从原型的原型继续查找,直到查找到Object.prototype为止。

具有继承关系的父类和子类,在JavaScript中通常使用构造函数来表示。在子类构造函数中,我们可以使用call方法调用父类的构造函数来初始化子类的属性,从而实现继承的效果。下面是一个示例代码:

// 定义一个父类
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function() {
  console.log('Hi, I am ' + this.name);
}

// 定义一个子类
function Student(name, age, grade) {
  Person.call(this, name, age);
  this.grade = grade;
}

// 建立继承关系
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

// 在子类中定义自己的方法
Student.prototype.sayGrade = function() {
  console.log('My grade is ' + this.grade);
}

var student = new Student('Tom', 18, 90);
student.sayHi(); // 输出 "Hi, I am Tom"
student.sayGrade(); // 输出 "My grade is 90"

在上述代码中,我们定义了一个名为Person的父类和一个名为Student的子类。在子类的构造函数中,我们调用了父类的构造函数,并传入了nameage两个参数。然后,我们使用Object.create方法创建了一个新的对象,并将其原型对象设置为父类的原型对象,从而建立了继承关系。最后,在子类中定义了一个新的方法sayGrade,并在子类的实例中调用了该方法。

三、JS继承的方式

在JavaScript中,实现继承的方式有很多种,下面简单介绍一下常用的几种:

1.原型链继承

原型链继承是最经典的继承方式之一,它的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。具体实现参考如下代码:

// 定义一个父类
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHi = function() {
  console.log('Hi, I am ' + this.name);
}

// 定义一个子类
function Cat(name) {
  this.color = 'white';
}

// 建立继承关系
Cat.prototype = new Animal();

// 在子类中定义自己的方法
Cat.prototype.sayColor = function() {
  console.log('My color is ' + this.color);
}

// 创建子类的实例并调用其方法
var cat = new Cat('Mimi');
cat.sayHi();
cat.sayColor();

在上述代码中,我们通过将子类的原型对象设置为父类的实例来实现继承。这样,子类就可以访问到父类中定义的属性和方法。但是,在使用原型链继承时,由于子类的原型对象是父类的实例,子类的实例可能会共享同一个父类实例的属性和方法。这可能会导致一些意想不到的问题,因此在使用时需要注意潜在的风险。

2. 构造函数继承

构造函数继承是将父类的构造函数作为子类的构造函数的一部分来运行,从而实现继承的方式。具体实现参考如下代码:

// 定义一个父类
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHi = function() {
  console.log('Hi, I am ' + this.name);
}

// 定义一个子类
function Cat(name) {
  Animal.call(this, name);
  this.color = 'white';
}

// 在子类中定义自己的方法
Cat.prototype.sayColor = function() {
  console.log('My color is ' + this.color);
}

// 创建子类的实例并调用其方法
var cat = new Cat('Mimi');
cat.sayHi();
cat.sayColor();

在上述代码中,我们通过在子类的构造函数中调用父类的构造函数,并且通过使用call方法确保在子类中创建的新对象将会成为父类中的this。这样,子类就可以访问到父类中定义的属性和方法。但是,在使用构造函数继承时,子类无法访问父类原型对象中定义的属性和方法。

3. 组合继承

组合继承是将原型链继承和构造函数继承组合起来使用的一种继承方式,它的基本思想是使用构造函数继承来继承实例属性,而使用原型链继承来继承原型属性。具体实现参考如下代码:

// 定义一个父类
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHi = function() {
  console.log('Hi, I am ' + this.name);
}

// 定义一个子类
function Cat(name) {
  Animal.call(this, name);
  this.color = 'white';
}

// 建立继承关系
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

// 在子类中定义自己的方法
Cat.prototype.sayColor = function() {
  console.log('My color is ' + this.color);
}

// 创建子类的实例并调用其方法
var cat = new Cat('Mimi');
cat.sayHi();
cat.sayColor();

在上述代码中,我们通过在子类中对父类进行构造函数调用实现了对实例属性的继承;使用Object.create方法创建了一个新的对象,并把父类原型对象复制到其中,从而建立了继承关系。这样,子类就可以同时访问到父类的实例属性和原型属性。但是,在使用组合继承时,我们需要调用两次父类的构造函数,这可能会产生一些性能上的问题。

四、总结

通过上述讲解,我们可以知道实现JavaScript继承的方式有很多种,包括原型链继承、构造函数继承和组合继承等等。我们应根据重用的需要和继承的复杂度,来选择不同的继承方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript学习笔记(十) js对象 继承 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JS动态添加与删除select中的Option对象(示例代码)

    下面我将详细讲解如何通过JavaScript动态地添加和删除<select>元素中的<option>元素。 1. 添加<option>元素 通过JavaScript动态地往<select>元素中添加<option>元素,可以用以下代码: // 获取<select>元素 var selec…

    JavaScript 2023年6月10日
    00
  • JS中的正则表达式及pattern的注意事项

    JS中的正则表达式及pattern的注意事项 在JS中,正则表达式是一个用于匹配字符串模式的对象,可以用来进行字符串的查找、替换、删除等操作,是一项非常重要的功能。在使用正则表达式的过程中,我们需要注意一些pattern的注意事项,下面就来详细介绍。 1. 正则表达式的基本语法 在JS中,我们可以通过使用RegExp对象来创建正则表达式,同时也可以使用字面量…

    JavaScript 2023年6月11日
    00
  • 深入学习JavaScript对象

    深入学习JavaScript对象 介绍 JavaScript 中的对象是一种复杂的数据类型,它可以用来组织和存储数据。本攻略将介绍 JavaScript 对象的基本概念以及如何使用它们。 创建对象 在 JavaScript 中有两种创建对象的方式:利用对象字面量和利用构造函数。 对象字面量 对象字面量是由一对花括号包裹的键值对集合。 // 创建一个对象字面量…

    JavaScript 2023年5月17日
    00
  • JS中let的基本用法举例

    JS中let是一种声明变量的关键字,而且它是在ES6(ECMAScript 2015)中引入的。相对于var关键字,let具有更为严格的作用域和更加灵活的用法。以下是let的几个基本用法: 1. 块级作用域 let关键字通过块级作用域,可以让我们更灵活地控制变量的作用域范围。块级作用域,指的是在代码块内声明的变量,在代码块外是不可见的。例如: functio…

    JavaScript 2023年5月28日
    00
  • 基于JavaScript 声明全局变量的三种方式详解

    当我们需要在JavaScript中定义一个全局变量时,我们可以使用以下三种方式: 1. 在全局作用域下声明变量 第一种方式是直接在全局作用域中声明变量,这样的变量就会成为全局变量。 // 直接在全局作用域中声明变量,成为全局变量 var globalVariable = ‘我是全局变量’; 上述代码中,使用 var 关键字直接声明一个变量 globalVar…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript的表达式与运算符

    详解JavaScript的表达式与运算符 什么是表达式与运算符? 表达式(Expression)是一个可求值的代码片段,它可以包含变量、运算符、函数调用等,并最终会返回一个值。JavaScript 中的表达式有很多种类,如算术表达式、赋值表达式、比较表达式、逻辑表达式等。 运算符(Operator)则是用来处理表达式的一种特殊符号,它可以识别操作数之间的关系…

    JavaScript 2023年5月19日
    00
  • Yii2框架数据验证操作实例详解

    下面我就来详细讲解一下“Yii2框架数据验证操作实例详解”。 概述 在Web应用程序中,数据的安全性和准确性非常重要,因此我们需要对请求中的数据进行严格的验证。Yii2框架提供了丰富的数据验证机制,本篇攻略旨在对Yii2框架数据验证机制进行详细的介绍和实例操作。 验证器(Validators) 在Yii2框架中,我们通过验证器类来定义和实现数据的验证规则。Y…

    JavaScript 2023年6月11日
    00
  • 论JavaScript模块化编程

    论JavaScript模块化编程 JavaScript的模块化编程是指将一个大型的应用程序划分为小的、互相依赖的模块,每个模块具有特定的功能,实现模块的高内聚、低耦合的特性,方便代码的维护和复用。本文将介绍如何使用JavaScript进行模块化编程,并分别通过常规模块化和ES6模块化两个实例进行说明。 常规模块化 常规模块化是JavaScript模块化的老方…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部