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

yizhihongxing

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

相关文章

  • jquery获取URL中参数解决中文乱码问题的两种方法

    接下来我将详细讲解“jquery获取URL中参数解决中文乱码问题的两种方法”的完整攻略。 问题描述 由于中国所有的编码都是基于 Unicode,因此 UTF-8 编码也经过传递被应用在了 URL 地址中。而浏览器在向服务器传递请求的时候,会自动将请求参数进行编码(包括中文),所以在 URL 中看起来是一堆乱码,而我们在使用 jQuery 获取 URL 中的参…

    JavaScript 2023年5月19日
    00
  • 使用Javascript监控前端相关数据的代码

    使用Javascript监控前端相关数据,主要可以从以下几个方面入手: 1. 捕获Javascript错误 Javascript错误捕获可以帮助我们了解用户在使用网站时可能遇到的错误,从而及时发现并解决这些问题。我们可以使用window.onerror方法来捕获Javascript错误,该方法需要传入三个参数: window.onerror = functi…

    JavaScript 2023年5月28日
    00
  • Ionic2系列之使用DeepLinker实现指定页面URL

    关于“Ionic2系列之使用DeepLinker实现指定页面URL”的完整攻略,我们可以进行如下的讲解: 概述 在Ionic2应用中,使用DeepLinker可以轻松地实现URL指定页面跳转的效果。DeepLinker可以将页面和URL映射起来,这样就能够通过URL来精确地打开指定的页面了。 详细步骤 下面我们将会依次介绍使用DeepLinker实现指定页面…

    JavaScript 2023年6月11日
    00
  • JS前端面试题详解之手写bind

    JS前端面试题中的手写bind方法,可以分为以下几个步骤实现: 1. 确定bind方法的基本用法 bind方法的基本用法是将一个函数绑定到一个对象上,使这个函数在调用时始终作用于该对象。这个函数的返回值是一个新函数,且可以以后面的参数作为调用时函数的参数。 2. 确定手写bind方法的实现方式 手写bind方法可以通过以下步骤实现: 返回一个函数 在这个函数…

    JavaScript 2023年6月10日
    00
  • JS去掉字符串中所有的逗号

    要去掉一个JavaScript字符串中的所有逗号,可以使用replace()方法。以下是详细步骤: 步骤1:使用正则表达式查找所有的逗号,并替换为一个空字符串。在replace方法中,正则表达式为/,/g,其中第一个斜杆表示开始正则表达式,中间的逗号表示要替换的字符,第二个斜杆表示正则表达式的结束,而字母”g”表示全局标志,指示替换所有匹配的字符串。 步骤2…

    JavaScript 2023年5月28日
    00
  • JavaScript本地数据存储sessionStorage与localStorage使用详解

    JavaScript本地数据存储sessionStorage与localStorage使用详解 什么是本地数据存储 在Web开发中,我们通常需要在前端与后端进行数据交互。但是,有些数据可能并不需要在后端进行处理,只需要在前端进行维护。这时本地数据存储就变得非常有用了。 本地数据存储是指将数据保存在浏览器本地而不是后端服务器上。利用本地数据存储框架,我们可以在…

    JavaScript 2023年6月11日
    00
  • JavaScript中利用构造器函数模拟类的方法

    构造器函数是JavaScript中一种特殊的函数,用于创建和初始化对象。利用构造器函数可以模拟类的概念。本文将介绍如何使用构造器函数来实现类似于类的功能。 创建构造器函数 要创建一个构造器函数,可以使用function关键字,并使用大写字母开头的函数名。下面是一个示例: function Person(name, age) { this.name = nam…

    JavaScript 2023年6月10日
    00
  • 你所不了解的javascript操作DOM的细节知识点(一)

    下面就为大家详细讲解“你所不了解的JavaScript操作DOM的细节知识点(一)”的完整攻略。 什么是DOM? DOM(文档对象模型)是指一种用于在HTML、XML等文档中描述元素的层次结构的API。通过DOM,JavaScript可以获取和修改文档的内容和结构。 元素节点和文本节点 在DOM中,每一个HTML元素都被表示为一个元素节点(element n…

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