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)
时间: 2024-10-11 07:22:35