js之重写原型对象
“实例中的指针仅指向原型,而不是指向构造函数”。
“重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的关系;它们引用的仍然是最初的原型”。——前记
var fun = function(){} fun.prototype = { name : 'peter', age : 25 } var a = new fun(); var b = new fun(); console.log(a.name, b.name);//peter peter fun.prototype.name = 'jack'; console.log(a.name, b.name);//jack jack fun.prototype = {}; fun.prototype.name = 'tom'; console.log(a.name, b.name); //jack jack console.log('1',b.constructor === fun) //1 false console.log('2',b instanceof fun) //2 false b.constructor.prototype.name = 'kitty'; //b.constructor.prototype指向的是fun的prototype console.log(a.name, b.name); //jack jack //如何修改a和b的name是tom? a.__proto__.name = 'tom'; console.log(a.name,b.name)
上面的b.constructor指向的是构造函数,但是如果构造函数原型被重写,b.constructor !== fun了,原因是指针指向的其实是原型对象。所以:实例化对象的constructor对象不是任何时候都指向构造函数本身,除非构造函数的原型一直不变,如果构造函数原型重写,全等关系就破灭了。
可以看出,实例在原型修改前后的不同,实例只继承实例化之前的原型,可以修改属性值,但是如果重写,那么实例化对象的指针__proto__指向的还是以前的原型对象,如果想要重写实例的原型,则需要修改实例化对象的__proto__属性值了。
【完】
The normal,they make me feel afraid
The crazy, they make me feel sane