原型中的constructor被破坏问题

122 篇文章 11 订阅

构造函数的prototype属性指向它的prototype对象,也就是原型对象,在原型对象中有一个constructor属性,指向该构造函数。但是我们在使用构造函数时,一般会重写它的原型,会导致constructor指向出问题。 

function Person() {   
 this.password = null;}
 Person.prototype.username = "renjialei";
 Person.prototype.password = '1234567';
 Person.prototype.hometown = ' shanxi'; 
 var person = new Person();console.log(Person.prototype.constructor === Person); 
  //true //采用字面量方式重写原型导致原型的constructor指向了Object。
  Person.prototype = {    username: '任佳磊',   
   password: '123456',    hometown: '陕西'}
  console.log(Person.prototype.constructor === Person);  //false

上面这段代码是将对象的原型重写,所以他的指向发生了转变。需要注意的是原型依旧没有销毁,只是他的指向发生了转变。原型也跟着变了。

function Animal() {} 
Animal.prototype.say = function () 
{     
console.log('gou'); 
} 
var dog = new Animal(); 
Animal.prototype =
 {     
say : function () {         
console.log('mao');     
                  }
 } 
var cat = new Animal();
console.log(dog.constructor);//function Animal()
console.log(cat.constructor);//function Object()
console.log(cat.constructor.prototype);

上面这段代码的结果是:

重新设置了原型所以造成了costructor指向新的对象,而底下的cat又将这个对象给接收。此时cat的原型就是我们新设置的对象。

因此有结果

dog.say();// gou
cat.say();//mao

不过需要注意的是原先设置的那个原型已经被dog接收,那个不会被覆盖。

 function Animal() {}
        var dog = new Animal();
        Animal.prototype = {
            say: function() {
                console.log('mao');
            }
        }
        Animal.prototype.name = "renjialei"
        console.log(dog.name)   //undefined
        console.log(dog.__proto__.constructor);  //Animal(){}

 这块需要注意的是如果在new之后给函数重新写一个原型对象,那么这个原型跟我这个实例没有半点关系!(原理就是对象保存在堆中,指针一变,所有的东西都变了)

 本文链接:原型中的constructor去哪了_社会你磊哥,命硬不弯腰的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值