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

下面是“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日

相关文章

  • javascript中的Array对象(数组的合并、转换、迭代、排序、堆栈)

    下面是关于JavaScript中的Array对象的完整攻略: 概述 Array是JavaScript中用于存储和操作一组数据的对象,它是一种有序列表,可以存储不同类型的值,包括数字、字符串、对象、甚至是其它数组。 在使用Array时,我们可以通过许多方法来操作它,这些方法可以帮助我们对数组进行合并、转换、迭代、排序和操作堆栈。接下来我们将逐一介绍这些方法。 …

    JavaScript 2023年5月27日
    00
  • js实现字符全排列算法的简单方法

    下面是js实现字符全排列算法的简单方法的攻略: 1. 了解全排列算法的原理 全排列算法主要是针对给定的字符串,对其中的每个字符进行交换得到不同的排列。这个算法的主要思路是不断地交换当前字符串中的两个字符,直到交换到字符串的最后一个字符,然后将这一个排列输出,并将字符串还原到初始状态,进行下一次交换操作。 2. 实现全排列算法的代码 下面给出一种简单的实现全排…

    JavaScript 2023年5月28日
    00
  • js调试系列 控制台命令行API使用方法

    JS调试系列:控制台命令行API使用方法 控制台是Web浏览器开发工具的一部分,可以用于调试JavaScript代码以及检查页面元素。控制台中包含了一个强大的命令行接口,用户可以通过API直接与页面交互,从而进行调试、编辑、修改和测试。 本文将详细讲解控制台命令行API的使用方法,包括常见的API函数、参数、数据类型、输出格式等,并附带两个实例说明。 控制台…

    JavaScript 2023年5月27日
    00
  • JavaScript变量声明var,let.const及区别浅析

    JavaScript变量声明var,let,const及区别浅析 在JavaScript中,我们可以使用 var,let 和 const 关键字来声明变量,但这些关键字的用法和区别是比较容易混淆的。本文将对这三种关键字进行详细讲解。 var 在ES6之前,JavaScript中只有 var 这一个声明变量的关键字。var 关键字声明的变量作用域是函数级别的。…

    JavaScript 2023年6月10日
    00
  • 谈谈我对JavaScript原型和闭包系列理解(随手笔记6)

    来详细讲解一下“谈谈我对JavaScript原型和闭包系列理解(随手笔记6)”这篇文章。 标题 文章的标题是“谈谈我对JavaScript原型和闭包系列理解(随手笔记6)”,主要内容是探讨JavaScript中的原型和闭包。 正文 原型 在JavaScript中,每个对象都有一个原型对象(即 prototype 属性)。原型对象是一个普通的对象,它有可能也有…

    JavaScript 2023年6月10日
    00
  • asp.net Javascript获取CheckBoxList的value

    下面我将详细讲解如何使用 JavaScript 在 ASP.NET 中获取 CheckBoxList 的值。 1. 获取 CheckBoxList 中选中项的值 要想获取 CheckBoxList 中选中项的值,可以通过以下的方式实现: // 获取 CheckBoxList 的实例 var cbList = document.getElementById(‘…

    JavaScript 2023年6月10日
    00
  • 简单谈谈javascript高级特性

    简单谈谈Javascript高级特性 1. 闭包 1.1 什么是闭包 闭包是指有权访问另一个函数作用域中变量的函数,常用来创建私有变量和方法,还可以用来实现函数柯里化等。 1.2 闭包的使用场景 1.2.1 创建私有变量和方法 function counter() { var count = 0; return { increment: function()…

    JavaScript 2023年6月10日
    00
  • javascript 在线文本编辑器实现代码

    实现一个 JavaScript 在线文本编辑器的具体思路如下: 创建一个文本输入框,接受用户输入的文本; 创建一个可编辑的文本区域,将用户输入的文本显示在此区域内; 设置文本区域的样式和属性,使之可编辑; 当用户在文本区域中进行编辑操作时,通过 JavaScript 监听用户的输入操作,并实时更新显示内容; 将编辑后的文本内容提交到后台进行保存。 下面是实现…

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