JS中的六种继承方式以及优缺点总结

yizhihongxing

下面是详细讲解“JS中的六种继承方式以及优缺点总结”的完整攻略。

JS中的六种继承方式

在JS中,继承是OO的一个重要的概念,通过继承可以实现代码的重用和封装性,JS中有六种继承方式,分别是:

1.原型链继承

原型链继承是JS中最常见的一种继承方式,它是利用原型对象来实现的,将子类的原型指向父类的实例,从而实现子类继承父类的方法和属性。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
};
function Student(name,grade){
    this.grade = grade;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;

2.构造函数继承

构造函数继承是通过在子类的构造函数内部调用父类构造函数来实现的,使子类自身具有父类的方法和属性。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
};
function Student(name,grade){
    Person.call(this,name);
    this.grade = grade;
}

3.组合继承

组合继承是将原型链继承和构造函数继承结合起来,既可以实现子类继承父类原型上的属性和方法,也可以避免父类属性被多个子类共享的问题。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
};
function Student(name,grade){
    Person.call(this,name);
    this.grade = grade;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;

4.原型式继承

原型式继承是利用已有的对象来创建新的对象,这种方式和原型链继承原理类似。

function createPerson(obj){
    function F(){}
    F.prototype = obj;
    return new F();
}
var person = {name:'Tom'};
var student = createPerson(person);

5.寄生式继承

寄生式继承是在原型式继承的基础上添加一个构造函数,从而对继承的对象进行加工。

function createPerson(obj){
    function F(){}
    F.prototype = obj;
    return new F();
}
function createStudent(obj,grade){
    var student = createPerson(obj);
    student.grade = grade;
    return student;
}
var person = {name:'Tom'};
var student = createStudent(person,5);

6.寄生组合式继承

寄生组合式继承是组合继承的一种优化,它避免了两次调用父类构造函数和创建不必要的父类实例的问题。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log(this.name);
};
function Student(name,grade){
    Person.call(this,name);
    this.grade = grade;
}
function inheritPrototype(subType,superType){
    var prototype = Object.create(superType.prototype);
    prototype.constructor = subType;
    subType.prototype = prototype;
}
inheritPrototype(Student,Person);

优缺点总结

1.原型链继承

优点:

  • 父类的属性和方法可以被子类共享和继承。
  • 父类的方法可以被子类重写,从而实现多态。

缺点:

  • 子类无法向父类构造函数传递参数。
  • 多个子类实例共享父类的引用类型属性,会相互影响,无法实现互不干扰。

2.构造函数继承

优点:

  • 子类独立拥有父类的属性和方法,不会相互影响。

缺点:

  • 子类无法继承父类原型上的属性和方法。
  • 父类的方法无法被子类重写,无法实现多态。

3.组合继承

优点:

  • 可以继承父类原型上的属性和方法。
  • 父类的属性和方法在子类实例中不会共享,可以互不干扰。

缺点:

  • 父类构造函数会被调用两次,创建不必要的父类实例。
  • 子类原型上会存在父类的属性和方法,占用内存。

4.原型式继承

优点:

  • 可以通过类似复制对象的方式创建新的对象,非常方便。

缺点:

  • 新对象的属性和方法是共享的,无法实现互不干扰。

5.寄生式继承

优点:

  • 可以通过类似复制对象并在其基础上进行加工的方式创建新的对象,非常方便。

缺点:

  • 新对象的属性和方法是共享的,无法实现互不干扰。

6.寄生组合式继承

优点:

  • 可以继承父类原型上的属性和方法。
  • 不需要创建不必要的父类实例,避免了内存占用和构造函数被调用两次的问题。

缺点:

  • 代码相对复杂,需要使用一个额外的函数。

示例说明

示例1:原型链继承

function Animal(){
    this.type = 'animal';
}
Animal.prototype.sayType = function(){
    console.log(this.type);
};
function Dog(name){
    this.name = name;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var dog = new Dog('旺财');
dog.sayType();//输出:animal

该示例中的Dog类通过原型链继承Animal类的属性和方法,从而实现了sayType方法的调用。

示例2:组合继承

function Animal(){
    this.type = 'animal';
}
Animal.prototype.sayType = function(){
    console.log(this.type);
};
function Dog(name){
    Animal.call(this);
    this.name = name;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var dog = new Dog('旺财');
console.log(dog.type);//输出:animal

该示例中的Dog类通过组合继承Animal类的属性和方法,从而实现了type属性的调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中的六种继承方式以及优缺点总结 - Python技术站

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

相关文章

  • 关于javascript document.createDocumentFragment()

    下面是关于 document.createDocumentFragment() 的详细攻略: 简介 document.createDocumentFragment() 方法创建并返回了一个空文档节点 DocumentFragment。DocumentFragment 可以看作是一个轻量级的文档对象,可以用来在文档的 DOM 结构上进行操作,而不会对文档本身产…

    JavaScript 2023年6月10日
    00
  • javascript实现在网页中运行本地程序的方法

    实现在网页中运行本地程序的方法可以使用Javascript中的node-webkit模块。下面将详细介绍node-webkit的使用方法: 安装node-webkit模块 在安装node-webkit之前,需要安装Node.js环境。安装Node.js后即可使用npm命令安装node-webkit模块。在命令行中执行以下命令: npm install nw …

    JavaScript 2023年5月27日
    00
  • js获取html参数及向swf传递参数应用介绍

    下面是针对“js获取html参数及向swf传递参数应用介绍”的完整攻略。 1. JS获取HTML参数 1.1 通过 URL 参数获取 JS获取 HTML 参数的最简单方法是解析 URL 参数。通过 window.location.search 可以获取到 URL 中的查询字符串部分,这个部分包含了所有的参数和它们的值。 示例: const queryStri…

    JavaScript 2023年5月27日
    00
  • JS原型prototype和__proto__用法实例分析

    来讲一下JS原型prototype和__proto__用法的攻略。 1. 前置知识 在开始之前,需要了解一些前置知识: JavaScript中所有对象的原型都是 Object.prototype,它包含了常用的方法如 toString()、valueOf() 等。 每个 JavaScript 对象都有一个 __proto__ 属性,指向它的原型对象。这个属性…

    JavaScript 2023年6月10日
    00
  • JS中常用的输出方式(五种)

    当我们在编写JavaScript代码时,需要将程序运行的结果在控制台或者网页上输出,此时就需要使用JavaScript提供的输出函数。JS中常用的输出方式有以下五种: 1. alert() 语法:alert(要输出的内容); 作用:在页面上弹出一个消息框,并在里面输出指定的内容。 示例: alert("您的操作有误,请重新输入!"); /…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript的Symbol类型、隐藏属性、全局注册表

    详解JavaScript的Symbol类型、隐藏属性、全局注册表 JavaScript的Symbol类型 JavaScript的Symbol类型是ES6新增的一种基本数据类型,可以用来创建唯一的身份标识符。它是一种类似于字符串的数据类型,但是具有唯一性,并且不可变。 Symbol类型的创建方法是通过Symbol()函数,例如: const key = Sym…

    JavaScript 2023年5月27日
    00
  • 详解操作cookie的原生方法cookieStore

    下面是详解操作cookie的原生方法cookieStore的完整攻略。 一、什么是cookieStore cookieStore 是浏览器 JavaScript 运行时的一个 API,用来管理浏览器中所有的 cookie,可用于对 cookie 实现增删改查等操作。 二、cookieStore的基本使用方法 cookieStore API 可以使用在浏览器中…

    JavaScript 2023年6月11日
    00
  • uniapp使用H5调试时跨域问题解决

    下面我来详细讲解如何在uniapp中使用H5调试时解决跨域问题。 背景介绍 在uniapp项目中,有时我们需要在H5模式下进行开发调试。但是,由于H5的安全策略限制,常会出现跨域问题导致无法正常显示页面或获取数据的情况,特别是对于与服务器接口交互的场景。本文将介绍如何解决uniapp项目在H5模式调试时跨域问题。 解决方案 uniapp项目在H5模式调试时,…

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