javascript原型链上constructor属性的丢失问题

         当我们在给原型增加多个属性的时候,如果重复输入Chenqiguo.prototype.xxx很多遍,那么代码就会显得比较臃肿,并且增加了代码开销,我们可以对原型使用字面量的方法来改善,例如下面这种情况:
        Chenqiguo.prototype = {
            getName:function(){
            
            },
            setNaem:function(){
            
            },
            delName:function(){
            
            }
        }
        不幸的是,这样写出来的代码会有一些属性的隐式丢弃,例如constructor属性
        

        当我们在给Chenqiguo.prototype赋以新值的时候,javascript将不再为该对象创建constructor属性。这表示对constructor属性的[[get]]会引发解释器沿着原型链查找,直至找到相应的值。在我们现在的这个构造器中,constructor属性查找的是object.prototype,而后者的constructor属性值是Object
       

        相信说了半天的语言文字,估计很少人能看懂到底是什么意思,老规矩,继续上代码,用代码的方法来解释估计大家一下就明白了
        //单独给Circle.prototype赋值
        function Circle(radius){
            this.radius = radius;
        }
        
        Circle.prototype.getName = function(){
            return '123';
        }    
        Circle.prototype.setName = function(){
            return '123';
        }        
        
        alert(Circle.prototype.constructor);//这里打印的原型上的constructor是Circle,此时它的构造函数指向了正确的Circle对象
        
        //以对象字面量的方式给Circle.prototype赋值
        function Circle(radius){
            this.radius = radius;
        }
        Circle.prototype={
            getName:function(){
                return '123';
            },
            setName:function(){
                return '123';
            }
        }
        alert(Circle.prototype.constructor);//这里打印的是object,它的constructor不指向Circle对象了
        
        第二种方法更符合开发人员的写法,不管从代码的美观程度还是对代码的实用程度来说都是如此。那么有没什么办法解决这个问题呢?通过以下方法可以解决这个问题
        在原型字面量内部强制指定它的constrcutor属性为Circle对象,例如
        function Circle(radius){
            this.radius = radius;
        }
        Circle.prototype={
            constructor:Circle,
            getName:function(){
                return '123';
            },
            setName:function(){
                return '123';
            }
        }
        alert(Circle.prototype.constructor);//这里又会打印它的constructor为Circle
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值