构造函数的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之后给函数重新写一个原型对象,那么这个原型跟我这个实例没有半点关系!(原理就是对象保存在堆中,指针一变,所有的东西都变了)