1 //简单重写原型对象: 2 3 //一个构造函数Person 4 function Person(){ 5 6 } 7 //重写Person的原型 8 //把Person的原型赋值给一个新的对象 是我们重写的过程 9 Person.prototype={ 10 // 对于构造器 如果我们不给他写,则构造器就是Object的构造器了 11 constructor:Person, //加上构造器属性 这里有一点问题 因为构造器属性是不可枚举的,这里无法设置 12 name:"张三", 13 sayName:function(){ 14 alert(this.name); 15 } 16 }; 17 18 var p1 = new Person(); 19 alert(Person.prototype.constructor); 20 21 /* 22 以上我们认为模拟重写了一个构造函数的原型 23 但是有很多问题。构造器是不可枚举的,在这里我们无法实现不可枚举属性。 24 25 在js中提供Object.defineProperty(对象,属性,配置) 来实现设置属性的一些性质 26 重写一个原型就可以这样实现: 27 * */ 28 Object.defineProperty( 29 Person.prototype , //要配置的对象 30 "constructor", //配置对象的构造器 构造器 31 { //构造器的特性 32 enumerable :false, //构造器 不可枚举 33 value : Person //构造器的值是Person 34 } 35 ); 36 // 通过以上方式重写 就把构造器设置成不可枚举了 37 var p2 = new Person(); 38 for(attr in p2){ 39 alert(attr); 40 } 41 42 /* 43 注意:由于语言的动态性 44 45 在实例化对象之后 如果给原型添加属性或方法,实际上实例对象是能调用后添加的属性和方法 46 实例化之后 重写原型,实际上实例的原型还是指向原来的原型对象 不是新的原型对象 47 */ 48 function Person(){ 49 50 } 51 var p1 = new Person(); 52 Person.prototype.name="哈哈"; 53 alert(p1.name); //哈哈 因为p1的原型引用调用之前已经添加属性 可以使用 54 55 var p2 = new Person(); 56 Person.prototype = { 57 constructor : Person, 58 name:"xixi" 59 }; 60 alert(p2.name); //哈哈,实例对象之后改变构造器的原型,实例的对象的原型还指向原来的 61 62 var p3 = new Person(); 63 alert(p3.name); //xixi 因为这是在改变构造器原型之后的实例对象