js 原型链继承的一个小坑点

 <script type="text/javascript">
        function Animal() {
              this.size = ['large', 'small'];
        }
             function Cat() {
        }
        Cat.prototype = new Animal();

        var tom = new Cat();
        var peter = new Cat()
        console.log(tom.size); // ["large", "small"]
        console.log(peter.size); //["large", "small"]
         console.log(peter.size===tom.size); // true
    </script>

首先实例化cat构造函数,给cat的prototype添加Animal的属性。而这样的话,继承Animal里面的属性则是cat实例化对象共享的,new的两个对象的size属性都会指向原型链上Animal的size,故上上面代码的输出结果tom和peter的size都为同一个堆内存空间.下面给大家说一个坑点,刚学的小白不太熟悉的可能会踩坑。

 function Animal() {
            this.size = ['large', 'small'];
        }
        function Cat() {}
        Cat.prototype = new Animal();
        var tom = new Cat();
        var peter = new Cat()
        tom.size.push('aaa')
        console.log(tom.size); // ["large", "small",'aaa']
        console.log(peter.size); //["large", "small",'aaa']

由于上面的代码tom对象通过push修改了原型链上的size属性,所以tom和peter都会受到影响,这没有什么难理解的,请看下面的代码:

 function Animal() {
        this.size = ['large', 'small'];
    }
     function Cat() {}
    Cat.prototype = new Animal();
    var tom = new Cat();
    var peter = new Cat()
    tom.size = 1;
    console.log(tom.size); // 1
    console.log(peter.size); //["large", "small"]

上面的代码,tom把size赋值为1,只有tom对象里的size被修改了,peter里的size并没有受到影响,小白可能会疑惑,不是共享吗??原因在这里,如果使用了 = 赋值,则会在tom对象上var出一个新的size属性并且赋值为1,而这个属性是tom对象自己的,自然不会影响到peter的size属性。而如果使用push方法的话,tom会在自己的对象里寻找size属性,而tom是没有size属性的, 他的属性是通过原型链继承的,这个时候他会从他去原型链去寻找到 Animal 的size属性,并且修改他,而这个时候就会影响到两个对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值