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中定义类的方法汇总

    下面就来为大家详细讲解“JavaScript中定义类的方法汇总”。 一、使用函数定义类 在 JavaScript 中最基本的定义类的方式就是使用函数。函数内部使用 this 关键字绑定属性和方法,最终返回该函数本身,从而构成一个类。 function Person(name, age) { this.name = name; this.age = age; …

    JavaScript 2023年5月27日
    00
  • JavaScript使用push方法添加一个元素到数组末尾用法实例

    让我们来解析一下“JavaScript使用push方法添加一个元素到数组末尾用法实例”。 什么是JavaScript的push方法 在JavaScript中,push()方法可以向数组的末尾添加一个或多个元素,并返回该数组的新长度。这个方法的语法是: array.push(item1, item2, …, itemX) 参数: item1, item2,…

    JavaScript 2023年5月27日
    00
  • JavaScript数组实例的9个方法

    下面我来为您详细讲解JavaScript数组实例的9个方法: 1. push() arr.push(item1, item2, …, itemX); push() 方法向数组的末尾添加一个或多个元素,并返回新的长度。示例代码如下: let arr = [1, 2, 3]; // 向数组末尾添加元素4 arr.push(4); console.log(ar…

    JavaScript 2023年5月27日
    00
  • JS封装cookie操作函数实例(设置、读取、删除)

    下面我来为你详细讲解“JS封装cookie操作函数实例(设置、读取、删除)”的完整攻略。 什么是cookie cookie 是浏览器用于存储用户信息的一种机制。当我们需要在应用程序之间共享数据时,可以使用 cookie 来存储数据。它是一种名为键-值对的数据结构,可以存储在浏览器中的本地电脑上,并在将来的会话之间使用。 如何进行cookie操作 我们可以使用…

    JavaScript 2023年6月11日
    00
  • 老生常谈js中的MVC

    MVC(Model-View-Controller)是一种常用的架构模式,也是前端开发中常用的框架之一,它的目的是将应用程序的输入、处理和输出分离成模块化、清晰的结构,便于维护和开发。下面来详细讲解一下JavaScript中的MVC。 1. 模型层(Model) MVC的模型层(Model)代表一个应用程序中的数据和业务逻辑。任何来自控制器(Controll…

    JavaScript 2023年5月27日
    00
  • JavaScript中定时器setTimeout()和setInterval()的用法

    JavaScript中定时器包括setTimeout()和setInterval()两种函数,它们都可以让程序按照指定的时间间隔执行一定的代码。 setTimeout()函数 setTimeout()函数用于在指定的毫秒数后执行一段代码,语法如下: setTimeout(func, delay, param1, param2, …) 其中: func: …

    JavaScript 2023年6月11日
    00
  • Js判断参数(String,Array,Object)是否为undefined或者值为空

    要判断一个变量是否为undefined或者值为空,可以根据变量的类型采用不同的方法进行判断。 判断字符串类型变量是否为空 使用if语句结合||运算符对字符串类型的变量进行判断,示例代码如下: let str = ”; if (!str || str.trim().length === 0) { console.log(‘字符串为空’); } else { …

    JavaScript 2023年6月10日
    00
  • JavaScript中object和Object的区别(详解)

    JavaScript中object和Object的区别(详解) 在JavaScript中,object和Object是两个非常重要的概念,它们虽然名字相似,但它们之间存在着一些区别。下面将详细讲解这两个概念之间的区别。 object object是JavaScript中的一种原始数据类型,也被称为“对象类型”。object可以定义为一个独立的变量,也可以作为…

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