javascript继承的几种实现方法

因果关系记忆法:
因为原型链继承不能传参,所以有了构造继承,但是构造继承不能继承父级的原型,所以出现了结合两种方式的组合继承。
因为组合继承实例化了两次父类,性能有缺陷,强迫症的前端们忍不了,所以想出了原型式继承,再增强成寄生继承,把寄生继承跟组合继承一结合,变成了寄生组合继承,用来解决组合继承的小缺陷
来源:因果关系记忆法参考来源 https://blog.csdn.net/qq_38217940/article/details/124159897

1.构造函数继承 (无法继承父类原型链上的属性)

function Animal() {
    this.type = '猫科动物';
 }

function cat(name, age) {
     this.name = name;
     this.age = age;
     Animal.call(this); //方法一:使用call方法继承
 }
// cat.prototype = new Animal(); //方法2:使用prototype属性       
cat.prototype.constructor = cat;

var cat = new cat('小猫', 2);
console.log(cat.type + cat.name + cat.age)

2.原型继承 (所有属性被共享,而且不能传递参数)

		function person() {
            this.sex = "男性"
        }

        function son(name, age) {
            this.name = name;
            this.age = age;
        }
        son.prototype = new person(); //原型继承
        son.prototype.constructor = son;

        var son = new son('小明', 23)
        console.log(son.sex + son.name);

3.构造函数和原型的混合继承(组合式继承)

可以传参又继承了原型

		//构造函数
        function person1() {
            this.name = "哈克"
        }

        function child() {
            this.age = 23;
        }
        //原型继承,child函数继承了person函数的属性和方法
        child.prototype = new person1();
        //任何一个prototype对象都有一个constructor属性,指向它的构造函数,如果没有child.prototype = new
        //person() 这句话, child.prototype.constructor是指向child的, 加入这行之后, child.prototype.constructor是指向person的
        child.prototype.constructor = child;
        //实例化child()函数
        var demo = new child();
        console.log(demo.name); //得到被继承的属性
        //alert(demo.age)

4. es6继承方法(class继承)


//ES6引入了class类的概念,创建的每一个class类,都会有一个constructor()方法,该方法是一种用于创建和初始化class创建的对象的特殊方法--构造函数方法。

//constructor()方法里的 this 指向的是被创建的实例对象
 		 class per { //class
            constructor(name) {
                this.name = name;
            }
            sayName() {
                console.log(this.name);

            }
        }

        class Son extends per {
            constructor(name, age) {
                super(name) //类似java的继承方法 
                this.age = age;
            }
        }

        var son = new Son("张三", 25);
        console.log(son);
        son.sayName(); //从per继承过来的方法

5.寄生组合继承 (解决构造函数继承无法继承原型的属性)

 		function animal(name) {
            this.name = name;
            this.sleep = function () {
                console.log(this.name + "在睡觉");
            }
        }

        //增加原型属性
        animal.prototype.eat = function (food) {
            console.log(this.name + '正在吃' + food);
        }

        function fish(name) {
            animal.call(this, name); //构造继承父类
        }

        //创建一个没有实例的对象函数
        var Super = function () {};

        //为了使子类可以继承父类的原型属性; eat()方法
        Super.prototype = animal.prototype;

        fish.prototype = new Super(); //原型继承
        fish.prototype.constructor = fish;

        var fish = new fish("金鱼");

        console.log(fish.name);
        fish.sleep(); //从父类继承过来的
        fish.eat('食物')

几种继承方法的代码运行结果截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值