js继承的几种方式

ZY
• 阅读 1492

1. 原型链继承

原型链继承:想要继承,就必须要提供父类(继承谁,提供继承的属性)

//父级
function Person(name) {   //给构造函数添加参数
    this.name = name;
    this.age = 10;
    this.sum = function (){
        console.log(this.name)
    }
}
//原型链继承
function Per() {

}
Per.prototype = new Person(); //主要 实现继承
var per1 = new Per();
console.log(per1.age);  //10

重点:让新实例的原型等于父类的实例 特点:1.实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!) 缺点: 1>新实例无法向父类构造函数参数。 2>父子构造函数的原型对象之间有共享问题

2. 借用构造函数继承

使用call和apply借用其他构造函数的成员, 可以解决给父构造函数传递参数的问题, 但是获取不到父构造函数原型上的成员.也不存在共享问题

//父级
function Person(name) {   //给构造函数添加参数
    this.name = name;
    this.age = 10;
    this.sum = function (){
        console.log(this.name)
    }
}
//子构造函数
function Per(name) {
    //使用call借用Person的构造函数
    Person.call(this,name)
}
//测试是否有了Person的成员
var stn = new Per('我是');
stn.sum();   //   我是
console.log(stn.age)

重点:用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制)) 缺点:1、只能继承父类构造函数的属性。    2、无法实现构造函数的复用。(每次用每次都要重新调用)    3、每个新实例都有父类构造函数的副本,臃肿。 特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性。    2、解决了原型链继承缺点1、2、3。    3、可以继承多个构造函数属性(call多个)。    4、在子实例中可向父实例传参。

3. 组合继承

借用构造函数 + 原型式继承

//父级
function Person(name) {   //给构造函数添加参数
    this.name = name;
    this.age = 10;
    this.sum = function (){
        console.log(this.name)
    }
}
//创建子构造函数
function Per(name) {
    Person.call(this,name); //借用构造函数
}
Per.prototype = new Person() //继承原型链继承
var str = new Per('zhao');
console.log(str.name); //'zhao'  是继承了Per子构造函数的属性
console.log(str.age);  // 10   是继承了Person父类原型的属性

重点:结合了两种模式的优点,传参和复用 特点:1、可以继承父类原型上的属性,可以传参,可复用。    2、每个新实例引入的构造函数属性是私有的。 缺点:调用了两次父类构造函数(耗内存),子类的构造函数会代替原型上的那个父类构造函数

4. 原型链继承

//父级
function Person(name) {   //给构造函数添加参数
    this.name = name;
    this.age = 10;
    this.sum = function (){
        console.log(this.name)
    }
}
//设置父构建函数的原型
Person.prototype.fn = function (){
    console.log(this.age)
}
//构建子构造函数
function Per() {

}
//实现继承
var str = new Person(); //拿到父类的实例
console.log(str.age);  // 10
str.fn();    10

重点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。object.create()就是这个原理。 特点:类似于复制一个对象,用函数来包装。 缺点:1、所有实例都会继承原型上的属性。    2、无法实现复用。(新实例属性都是后面添加的)

5. 寄生式继承

//父级
function Person(name) {   //给构造函数添加参数
   function fn(){}
   fn.prototype = name; //继承传入的参数
   return new fn();  //返回函数对象
}
var str = new Person();
//以上是原型式继承,给原型式继承在套一个壳子传递参数 
function Per(name) {
    var fn1 = Person(name);
    fn1.name = "zhao";
    return fn1
}
var fn3 = Per(str);
console.log(fn3.name); //返回str对象,继承了str的属性

重点:就是给原型式继承外面套了个壳子。 优点:没有创建自定义类型,因为只是套了个壳子返回对象(这个),这个函数顺理成章就成了创建的新对象。 缺点:没用到原型,无法复用

6. 寄生组合式继承

function Person(name){
    this.name = name;
    this.hobbies = ['a','b','v']
};
function student(name,age){
    Person.call(this,name);
    this.age = age;
}
//关键的三步 实现继承
// 使用F空函数当子类和父类的媒介 是为了防止修改子类的原型对象影响到父类的原型对象
let fn = function (){};
fn.prototype = Person.prototype;

student.prototype = new fn();
var fn1 = new student('zhao','24')
console.log(fn1)

组合继承最大的缺点是最调用两次父构造函数 一次是设置子类实例的原型的时候:

 student.prototype = new Person();

一次是在创建子类型实例的时候:

var fn = new student('zhao','24')

7. es6实现继承

class parents {
    constructor(){
        this.grandmather = 'rose';
        this.grandfather = 'jack';
    }
}

class children extends parents{
    constructor(mather,father){
    //super 关键字,它在这里表示父类的构造函数,用来新建父类的 this 对象。
        super();
        this.mather = mather;
        this.father = father;
    }
}

let child = new children('mama','baba');
console.log(child)
点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
你不可不知的JS面试题(第二期)
1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa
Stella981 Stella981
3年前
JavaScript学习总结(十七)——Javascript原型链的原理
一、JavaScript原型链ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。在JavaScript中,用__proto__属性来表示一个对象的原型链。当查找一个对象的属性时,JavaScript会向上遍历原型
Wesley13 Wesley13
3年前
JS实现继承的几种方式
前言JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢?让我们拭目以待。JS继承的实现方式既然要实现继承,那么首先我们得有一个父类,代码如下://定义一个动物类functionAnimal(name){//属性this.name
Wesley13 Wesley13
3年前
JS必知的6种继承方式
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢?让我们拭目以待JS继承的实现方式既然要实现继承,那么首先我们得有一个父类,代码如下:// 父类function Person(name) { // 给构造函数添加了参数  this.name  name;
Stella981 Stella981
3年前
Javascript 是如何体现继承的 ?
js继承的概念js里常用的如下两种继承方式:原型链继承(对象间的继承)类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现在面向对象的语言中,我们使用类来创建一个自定义对象
Wesley13 Wesley13
3年前
Java的类继承
知识点1、继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足isa的逻辑关系,才能使用继承。如:苹果isa水果语法:使用extends连接子类和父类。子类extends父类Java是单继承,一个类只能继承一个父类。子类不能继承父类私有的属性,但是可以
Stella981 Stella981
3年前
JavaScript 基于原型链的继承
JavaScript对象是动态的属性“包”(指其自己的属性)。JavaScript对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。遵循ECMAScript标准,someObject.Prototype
Stella981 Stella981
3年前
Javascript中,实现类与继承的方法和优缺点分析
Javascript是一种弱类型语言,不存在类的概念,但在js中可以模仿类似于JAVA中的类,实现类与继承第一种方法:利用Javascript中的原型链1//首先定义一个父类23functionAnimal(name,age){4//定义父类的属性5thi
Stella981 Stella981
3年前
Javascript继承5:如虎添翼
/寄生式继承其实就是对原型继承的第二次封装,在封装过程中对继承的对象进行了扩展。也存在原型继承的缺点!!这种思想的作用也是为了寄生组合式继承模式的实现。///声明基对象varbook{name:'jsbook',al
ZY
ZY
Lv1
江汉思归客,乾坤一腐儒
文章
2
粉丝
1
获赞
6
热门文章