15分钟深入了解JS继承分类、原理与用法

下面是关于“15分钟深入了解JS继承分类、原理与用法”的完整攻略。

一、JS继承分类

JS继承可以分为以下几种类型:

  1. 原型链继承
  2. 借用构造函数继承
  3. 组合继承
  4. 原型式继承
  5. 寄生式继承
  6. 寄生组合式继承

二、JS继承原理

JS中的继承是基于原型的,每个对象都有__proto__属性,该属性指向对象的原型对象,原型对象又有__proto__属性,依次形成了一个原型链。当我们访问一个对象的属性时,如果该对象本身没有该属性,就会沿着原型链往上查找,直到找到该属性或者到达原型链的末尾为止。

三、JS继承用法

1. 原型链继承

原型链继承就是将父类的实例作为子类的原型,子类可以通过原型链继承到父类的属性和方法。

function Parent() {
  this.name = 'parent';
  this.sayHello = function() {
    console.log('Hello ' + this.name);
  };
}

function Child() {}

Child.prototype = new Parent(); 

// test
var child = new Child();
child.sayHello(); // Hello parent

2. 借用构造函数继承

借用构造函数继承就是子类使用父类的构造函数来构造自己的对象,相当于复制父类的属性和方法,实现了对父类属性的继承。但是父类原型中的方法和属性是无法继承的。

function Parent() {
  this.names = ['parent1', 'parent2'];
}

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

// test
var child1 = new Child();
child1.names.push('child1');
console.log(child1.names); // ["parent1", "parent2", "child1"]

var child2 = new Child();
console.log(child2.names); // ["parent1", "parent2"]

3. 组合继承

组合继承是将原型链继承和借用构造函数继承结合起来。通过原型链来实现对父类原型中方法和属性的继承,通过借用构造函数来实现对父类实例属性的继承。

function Parent() {
  this.name = 'parent';
  this.names = ['parent1', 'parent2'];
}

Parent.prototype.sayHello = function() {
  console.log('Hello ' + this.name);
}

function Child() {
  Parent.call(this);
  this.age = 18;
}

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

// test
var child = new Child();
child.names.push('child');
console.log(child.names); // ["parent1", "parent2", "child"]

child.sayHello(); // Hello parent

4. 原型式继承

原型式继承是通过原型对象来实现继承,它的本质是对一个对象的封装,返回一个可以继承该对象属性和方法的新对象。

var parent = {
  name: 'parent',
  sayHello: function() {
    console.log('Hello ' + this.name);
  }
};

var child = Object.create(parent);
child.name = 'child';

// test
child.sayHello(); // Hello child

5. 寄生式继承

寄生式继承是在原型式继承的基础上添加一些方法和属性,返回一个继承了原对象的扩展对象。

var parent = {
  name: 'parent',
  sayHello: function() {
    console.log('Hello ' + this.name);
  }
};

function createChild(obj) {
  var child = Object.create(obj);

  child.sayHi = function() {
    console.log('Hi ' + this.name)
  }

  return child;
}

var child = createChild(parent);
child.name = 'child';

// test
child.sayHi();  // Hi child
child.sayHello(); // Hello child

6. 寄生组合式继承

寄生组合继承是将组合继承中的一个缺点——继承原型对象时调用了一次父类构造函数——通过寄生继承方式解决。

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

Parent.prototype.sayHello = function() {
  console.log('Hello ' + this.name);
}

function Child() {
  Parent.call(this);
  this.age = 18;
}

function createObject(obj) {
  function F() {}
  F.prototype = obj;
  return new F();
}

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

// test
var child = new Child();
console.log(child.name); // parent
console.log(child.age); // 18

child.sayHello(); // Hello parent

以上就是关于“15分钟深入了解JS继承分类、原理与用法”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:15分钟深入了解JS继承分类、原理与用法 - Python技术站

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

相关文章

  • python爬取免费代理并验证代理是否可用

    针对 “python爬取免费代理并验证代理是否可用” 这个话题,我来给您详细讲解一下攻略。 1. 爬取免费代理 要爬取免费代理,我们可以利用 requests 库来发起网络请求。我们可以以 快代理 为例,代码如下所示: import requests from bs4 import BeautifulSoup def get_proxies(url): # …

    JavaScript 2023年5月28日
    00
  • vs2003 js文件编码问题的解决方法

    我来为您详细讲解如何解决Vs2003 JS文件编码问题。 问题描述 Vs2003在处理JS文件时,可能会出现编码不一致的问题。具体表现为,在编辑JS文件时,中文字符会出现乱码或者被替换成其他字符,导致代码意思无法理解。 解决方法 要解决这个问题,我们需要采取如下两个步骤: 步骤一:设置Vs2003默认编码格式 首先,我们需要在Vs2003中设置默认编码格式。…

    JavaScript 2023年5月20日
    00
  • js对象的读取速度实例详解

    关于“js对象的读取速度实例详解”,我会给出完整的攻略,以下是具体的内容: 1. 什么是js对象 JS对象是指在JS中可以通过{}或者new Object()定义出的对象,它是一个无序属性的集合,每个属性都是由属性名和属性值所组成。其中,属性名可以是字符串或者Symbol类型,属性值可以是任何JS数据类型。 2. js对象的读取速度 在JS编程中,对象的读取…

    JavaScript 2023年6月10日
    00
  • javascript常用正则表达式合集

    JavaScript常用正则表达式合集 正则表达式是一种强大的字符串匹配工具,可以在文本中找到特定的模式并进行替换、删除或提取操作。JavaScript常用正则表达式合集就是收集了一些在JavaScript中常见的正则表达式,让我们能够更加高效地应用正则表达式。 匹配数字 匹配数字的正则表达式可以用于验证表单中的数字输入是否合法,或者将文本中的数字提取出来作…

    JavaScript 2023年5月19日
    00
  • JS使用Promise时常见的5个错误总结

    JS使用Promise时常见的5个错误总结 Promise 是 JavaScript 异步编程的重要组成部分,它可以帮助我们更好地处理回调地狱问题,提高代码的可读性和可维护性。但是,在使用 Promise 进行编程时,可能会犯一些常见的错误。本文将总结 Promise 的5个常见错误,以及如何避免这些错误。 1. 没有正确处理 Promise 的错误 在编写…

    JavaScript 2023年5月28日
    00
  • js设置document.domain实现跨域的注意点分析

    关于“js设置document.domain实现跨域的注意点分析”的攻略,我将详细介绍如下: 什么是跨域? 在 Web 开发中,跨域是指在一个域下的文档或脚本试图去请求另一个域下的资源。简单来说,当浏览器向一个网站的服务器发送请求时,如果该请求要访问另外一个域名下的资源(比如 JavaScript 文件、CSS 文件等),那么就会发生跨域问题。 为什么需要跨…

    JavaScript 2023年6月10日
    00
  • javascript时间排序算法实现活动秒杀倒计时效果

    让我详细讲解一下“javascript时间排序算法实现活动秒杀倒计时效果”的完整攻略。 1. 确定倒计时的结束时间 在开始编写代码之前,我们需要确定倒计时的结束时间。可以通过获取服务器时间来确保倒计时的准确性。 // 获取服务器时间,假设服务器返回的时间为 "2022-01-01 00:00:00" (UTC+8) let serverT…

    JavaScript 2023年5月27日
    00
  • js使用i18n实现页面国际化的方法

    实现页面国际化(Internationalization,简称i18n)的方法在前端开发中非常常见,可以让我们的网站更易于被全球用户理解和使用。下面我将详细讲解如何使用JavaScript实现网站的i18n。 1. 建立语言包 首先,我们需要建立站点所需的多语言文字资源。针对不同语言,我们可以分别建立不同的语言包(language pack),其中保存着相应…

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