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