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

下面是详细讲解“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日

相关文章

  • python闭包的实例详解

    下面我将为您详细讲解 “Python闭包的实例详解”。 什么是闭包 在介绍闭包的实例之前,我们先来了解闭包的概念。闭包是指在函数内部再定义函数,并且这个内部函数可以引用到外部函数中的变量,叫做闭包。 下面是一个简单的例子,函数 counter 返回了内部函数 add,而 add 引用了外层的变量 n。 def counter(n): def add(m): …

    JavaScript 2023年6月10日
    00
  • Javascript基础学习笔记(菜鸟必看篇)

    我来讲解一下“Javascript基础学习笔记(菜鸟必看篇)”,这是一篇非常适合初学者的基础教程,内容涵盖了Javascript的基础语法和常用API。 基础语法 在这部分中,笔记介绍了Javascript的数据类型、变量、运算符、条件语句、循环语句等基础语法知识。 其中,有一段代码示例展示了如何使用条件语句来判断一个人的成绩等级: var score = …

    JavaScript 2023年5月18日
    00
  • 只出现一次的提示信息(js+cookies)

    下面是关于“只出现一次的提示信息(js+cookies)”的详细攻略: 问题描述 常见的网站应用场景是,用户在第一次访问网站时,我们需要给用户一些说明或提示信息,但是当用户再次访问网站时,我们希望这些提示信息仅在第一次访问时出现,之后访问也无需再次出现。 解决方案 我们可以使用js和cookies来解决这个问题。具体实现过程分为以下几条: 1. 判断是否是第…

    JavaScript 2023年6月11日
    00
  • JavaScript 获取事件对象的注意点

    JavaScript 获取事件对象的注意点 在 JavaScript 中,可以通过事件处理函数获取事件对象,用来获取事件触发时的相关信息,进而进行一些处理操作。但在获取事件对象时,需要注意一些细节问题。 1. 事件处理函数的参数 事件处理函数的参数,一般是事件对象。不同的浏览器可能会有不同的参数名和获取方式,因此我们需要注意跨浏览器的兼容性问题。 一种常见的…

    JavaScript 2023年5月27日
    00
  • js Array的用法总结

    JS Array的用法总结 简介 Javascript中的Array是一种有序数据类型,可以用来存储任何类型的数据,包括数字、字符串、甚至对象等。 声明与初始化 可以使用以下两种方式来声明和初始化一个数组: 直接声明并赋值 var arr = [1, 2, 3]; 使用Array()构造函数 var arr = new Array(1, 2, 3); 注意,…

    JavaScript 2023年5月27日
    00
  • 27个JavaScript数组常见方法汇总与实例说明

    「27个JavaScript数组常见方法汇总与实例说明」是一篇介绍JavaScript数组操作方法的文章,主要分为以下三个部分: 一、常见数组方法 这一部分介绍了JavaScript中常用的数组操作方法,包括concat()、push()、pop()、shift()、unshift()、reverse()、sort()、slice()、splice()、in…

    JavaScript 2023年5月18日
    00
  • js Math数学简单使用操作示例

    下面是关于“js Math数学简单使用操作示例”的完整攻略。 一、Math对象概述 JavaScript的内置对象之一是Math对象,它包含了许多常见的数学函数和常量。Math主要对数字进行操作,例如数学运算、幂运算、三角函数等。 二、Math对象中的常用方法 下面是 Math 对象中一些常用方法的介绍: 1. Math.floor() Math.floor…

    JavaScript 2023年5月27日
    00
  • React组件化的一些额外知识点补充

    当使用 React 进行开发时,组件是其最核心的元素。React 的组件化使得代码的管理变得更加容易,部件所需的功能通过 props 和 state 在组件层次结构中传递。但作为一个前端开发者,你还需要了解React 组件化的一些额外知识点,才能更洽肤的开发React应用。 一、PropTypes 组件可以是其他组件的子组件,父组件通常需要向子组件传递 pr…

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