美文网首页
JavaScript 继承

JavaScript 继承

作者: 芝麻香油 | 来源:发表于2019-12-05 16:24 被阅读0次

为什么要继承

举个例子,你有一个class A(如下),同时你还有class B,class C,class D,......,他们有一个共同的特点就是,都具有属性nameage,以及toString()方法。你此时的做法,方法一:剩下的每个类中都分别写这两个属性,以及toString方法,但是当toString的连词符改为/时,你不得不去修改每个类的toString方法;方法二:让其他的类都去继承A,这样toString这个方法就只在一个地方声明,并且变化的时候,只需修改一个地方即可。

class A {
  name: string;
  age: int;
  
  toString() {
    return `${this.name}——${this.age}`;
  }
}

/*
  方法一 
*/

class B {
  name: string;
  age: int;
  
  toString() {
    return `${this.name}——${this.age}`;
  }
}

// ...


/*
  方法二 
*/
class B extends A {
  // ....
}

class C extends A {
  // ...
}

// ...

类式继承

JavaScript也可以像其他类式继承的语言一样,通过函数声明类,用new创建实例,例如:

function Person(name) {
  this.name = name;
}

Person.prototype.getName = function() {
  return this.name;
}

// 使用

const person = new Person('Tom');
person.getName();

原型链

function A(name, books) {
  Person.call(this, name); // 调用Person构造函数
  this.books = books;
}

A.prototype = new Person();
A.prototype.constructor = A;
A.prototype.getBooks = function() {
  return this.books;
}
  1. 创建一个构造函数。在构造函数中调用超类的构造函数,并传参
  2. 使用 new运算符:创建一个空对象;调用构造函数,空对象处于作用域链的最前端
  3. 设置原型链

原型式继承

用类的方法创建对象:首先用一个雷的声明定义对象的结构;然后实例化该类创建一个新对象。用这种方式创建的对象都有一套该类的所有实例属性的副本(每个实例方法都只存在一份)。

而原型继承不需要用类来定义对象的结构,直接创建一个对象即可。该对象被称为原型对象,因为他为其他对象应用的模样提供了一个原型。

const Person = {
  name: 'name',
  getName: function() {
    return this.name;
  }
}
const reader = clone(Person);
console.log(reader.getName); // name
reader.name = 'Tom';
console.log(reader.getName); // Tom

clone函数可以用来创建新的类Person的对象,该对象的原型对象为Person。这意味在这个新对象中查找某个方法或属性时,如果找不到,那么查找过程会在其原型对象中继续进行

const A = clone(Person);
A.books = []; 
A.getBooks = function() {
  return this.books;
}

然后我们还可以重新定义该clone中的方法和属性。修改在Person中提供的默认值,或者添加新的属性和方法。

clone

在前面肯定纠结于clone里面究竟做了什么,且看下面:

function clone(object) {
  function F() {};
  F.prototype = object;
  return new F;
}
  1. 创建空函数F
  2. 将其prototype属性设置为作为参数object传入的原型对象
  3. 然后把新对象作为返回值返回

在第二步中,prototype属性就是通过原型链机制用来指向原型对象的,提供了所有继承而来的成员的链接。

掺元类

先创建一个包含各种 通用方法的类,然后用它扩充其他类。其中这个通用方法类是掺元类。

//定义Teacher类
var Teacher=function(){
  this.name='T';
  this.age=25;
};

//定义Student类
var Student=function(){
  this.name='S';
  this.age=1;
};

//定义掺元类
var Mixin=function(){};
//定义一个方法,只是序列化除function和object类的所有类型
Mixin.prototype.serialize=function(){
  var serializes=[];
  for(key in this){
    serializes.push(this[key]);
  }
  return serializes.join(", ");
};

/**
  将掺元类的所有方法扩充给接收类
*/
function augment(receivingClass,givingClass){
  for(methodName in givingClass.prototype){//如果已有同名方法则略过
    if(!receivingClass.prototype[methodName]){
      receivingClass.prototype[methodName]=givingClass.prototype[methodName];    
    }
  }
};

//扩充Teacher类
augment(Teacher,Mixin);
//扩充Student类
augment(Student,Mixin);

//初始化Teacher类
var t=new Teacher();
//初始化Student类
var s=new Student();


//序列化Teacher
alert(t.serialize());//结果:T,25
//序列化Student
alert(s.serialize());//结果:S,1

上面的例子中,serialize遍历this所有的成员

augment遍历掺元类的所有方法,并判断接受类是否有同名成员,没有则添加,有则跳过

继承适合场景

  1. 建立父子继承关系,继承的方法只需定义一次即可。需要修改的时候,也只要修改一个位置
  2. 内存效率比较重要的场合原型式继承;开发者熟悉其他面向对象语言中的继承,使用类式继承;类之间差异较大,用掺元类中的方法来扩充。

结语

  1. 类式继承是模仿Java等面向对象语言中类继承方式,适合于内存效率要求不高或开发人员不熟悉原型式继承的场合
  2. 原型继承工作机制:先创建一些对象然后再对其进行clone,从而得到创建子类和实例。因为这种方式会共享未被改写的属性和方法,所以创建的对象往往有较高的内存效率
  3. 掺元类:提供一个既能让对象和类共享一些方法又不需要让它们成为父子关系的途径。这个方式在于,让彼此有着较大差异的类共享一些通用方法

相关文章

  • 前端面试题目(二)

    javascript对象的几种创建方式 javascript继承的6种方法 详情:[JavaScript继承方式详...

  • 函数的原型对象

    什么是原型? 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承。 函数的原型...

  • 005|JavaScript ES6新特性之Classes

    在过去,需要像 053|JavaScript 继承详解 那样实现继承。JavaScript这种继承实现方式与其它面...

  • Web前端经典面试试题及答案2

    javascript面向对象中继承实现? 面向对象的基本特征有:封闭、继承、多态。在JavaScript中实现继承...

  • 一文带你彻底理解 JavaScript 原型对象

    一、什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。 1.1 ...

  • javascript代码积累

    一、javascript实现继承 1.基于原型链实现继承 2.基于属性和方法复制实现继承 二、javascript...

  • 理解 JavaScript 中的原型链

    JavaScript 作为一门面对对象语言,但是却不支持接口继承,只支持实现继承。JavaScript 中实现继承...

  • Javascript原型和原型链

    JavaScript在ES6之前没有类似class,extend的继承机制,JavaScript的继承主要是通过原...

  • JavaScript--对象创建和继承方法

    JavaScript创建对象方法总结精彩博文javascript继承讲解精彩博文于江水 继承讲解 JavaScri...

  • JavaScript 继承

    继承是JS中非常内容,原因就是JS没有地道的继承方式,我们只能通过各种方式来模拟面向对象中的继承。下面介绍几种常见...

网友评论

      本文标题:JavaScript 继承

      本文链接:https://www.haomeiwen.com/subject/zhtjgctx.html