JS中的类与类的继承

JS中的类与类的继承

我们知道,JS中没有类或接口的概念,即不能直接定义抽象的类,也不能直接实现继承。不过,为了编程的方便,我们可以在 JS 中模拟类和继承的行为。
首先捋清楚类和对象的关系:

    类:比如人类,指的是一个范围; 对象:比如某个人,指的是这个范围中具体的对象

js中的function作为构造函数时,就是一个类,通过new操作符,可以返回一个对象。


类的声明:

第一种:传统构造函数声明
function Animal(){
            this.name = 'tiger' 
        }
第二种:ES6中的class声明
class Animal{
    constructor(){
        this.name = 'tiger'
    }
}
生成实例:

虽然类的声明有多种方式不尽相同,但是类生成实例相同

new Animal, new Animal2 // 没有参数时候 ()可以省略

类的继承的2种方式(主要说明es5传统构造函数的方式):

第一种:借助构造函数实现继承
<script>
        function Tiger(){
            this.game = 'ow';
        }
        Tiger.prototype.code=function(){
            console.log('code M');
        }
        
        function Child1(){
            // <将构造函数Tiger的this指向子级构造函数child1的实例上>
            Tiger.call(this);
            this.type = 'child'
        }
        console.log(new Child1);
</script>
原理

子类继承父类,通过call/apply改变父类构造函数的this指向

缺点

只实现了部分继承,仅继承了父类的属性,并没有继承父类的原型对象上<原型链上>的方法


第二种:借助原型链实现继承
<script>
        function Funky(){
            this.friend = 'Pite';
            this.arr = [1,2,3];
        }
        Funky.prototype.dance = function(){
            console.log('let us dance!!!');
        }
        function Child2(){
            this.work = 'coder';
        }
        Child2.prototype = new Funky(); //new Child2().__proto__ === new Parent2()

        console.log(new Child2);
        
        var a1 = new Child2;
        var a2 = new Child2;
        a1.arr.push('666'); // 此处更改a1的arr,a2的arr也会跟着改变
        console.log(a1,a2);
</script>
原理

通过继承__proto__实现原型链继承:

1 在当前Child2实例上查找dance方法
2 发现没有 就会去 proto 上面去找dance方法
3 Child2实例的 proto === Parent2实例
4 去Parent2实例上查找dance方法 发现没有
5 去Parent2实例的 proto 查找dance方法
6 找到。

缺点

如果实例两个对象 改变其中一个对象的属性/方法 另一个对象也会跟着改变(因为改变的是原型链)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值