function Person(){}
Person.prototype.name = 'sun';
var person1 = new Person();
alert("Person最初原型:"+person1.name);
//第一次重写原型
Person.prototype = {
constructor : Person, //显式声明constructor
name : 'cheng',
age : 18
};
alert("原型被覆盖后P1:"+person1.name); //sun
//新实例
var person2 = new Person();
alert("原型覆盖后P2:"+person2.name); //cheng
alert("最初 :"+ person1.constructor); //指向Person
alert("覆盖后:"+ person2.constructor); //指向Person
//第二次覆盖原型
Person.prototype = {
constructor : Person,
name : 'ffff',
age : 18
};
alert("原型覆盖后P1:"+person1.name); //sun
alert("原型覆盖后p2:"+person2.name); //cheng
var person3 = new Person();
alert("原型覆盖后p3:"+person3.name); //fff
以上测试可以看出:
1:原型重写前创建的对象实例,始终指向重写前的prototype
2:原型重写后创建的对象实例,始终指向最新重写的prototype;
3:多个被重写的原型可以同时存在,并且都可以通过constructor与函数对象关联。
总结 ,对象实例中的[[prototype]]指针,始终指向对象实例被创建前最新出现的函数原型,永不改变;
多个原型可以同时存在,并于函数对象关联;(需要显式声明constructor)