更简单的原型语法的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象
<script type="text/javascript"> function Person(){} //原型中的constructor属性指向Object对象,而不是指向Person函数的 Person.prototype = { name : '彭传志', age : 29 }; //使用这种简单的原型语法,原型中的constructor已经不再指向Person函数了,而是指向Object构造函数 alert(Person.prototype.constructor == Object);//true //使用这种简单的原型语法,原型中的constructor已经不再指向Person函数了 alert(Person.prototype.constructor == Person);//false //原型对象prototype中有个"__proto__"属性,该属性指向另一个原型对象,该对象中有个constructor属性,该属性指向Object alert(Person.prototype.__proto__.constructor == Person.prototype.constructor);//true alert(Person.prototype.__proto__.constructor == Person.prototype);//false alert(Person.prototype.__proto__.constructor == Object);//true </script>
2.在上面的代码中,我们将Person.prototype设置为等于一个以对象字面量形式创建的新对象。最终结果相同,但有一个例外:constructor属性不在指向Person了。我们知道,每创建一个函数,就会同时创建它的prototype对象,这个对象也会自动获得constructor属性。而我们在这里使用的语法,本质上完全重写了默认的prototype对象,因此constructor属性页就变成了新对象constructor属性,指向Object构造函数,不再Person构造函数。
<script type="text/javascript"> function Person(){} //原型中的constructor属性指向Object对象,而不是指向Person函数的 /* Person.prototype = { name : '彭传志', age : 29 }; */ var person1 = new Person(); alert(Person.prototype.constructor == Object);//false alert(Person.prototype.constructor == Person);//true alert(Person.prototype.__proto__.constructor == Person.prototype.constructor);//false alert(Person.prototype.__proto__.constructor == Person.prototype);//false alert(Person.prototype.__proto__.constructor == Object);//true </script>
思考:
<script type="text/javascript"> function Person(){ } var person1 = new Person(); person1.age = 26; //Person.prototype.constructor上有name属性,而且是只读的,不能修改值 var descriptorName = Object.getOwnPropertyDescriptor(Person.prototype.constructor, 'name'); alert(descriptorName.writable);//false //constructor上是否可以添加属性??可以 Person.prototype.constructor.nameboss = "高伟刚"; alert(person1.__proto__.constructor.nameboss);//"高伟刚", constructor同样可以定义对象属性 alert(person1.nameboss);//undefined //在原型(prototype)的原型(__proto__)上添加属性name Person.prototype.__proto__.name = '小杰'; alert(person1.name);//"小杰" alert("__proto__" in Person.prototype.__proto__);//true alert(Person.prototype.__proto__.__proto__);//null, 说明有这个属性,属性的值为null alert(person1.__proto__.constructor == Person);//true //constructor对象有没有"__proto__"属性?? 有 alert(Person.prototype.constructor.__proto__.constructor == Object);//false alert(Person.prototype.constructor.__proto__.constructor == Function)//true alert(Person.prototype.constructor.__proto__);//function Empty(){} alert(Person.prototype.constructor.__proto__.constructor);//function Function(){[native code]} alert(Person.prototype.constructor.__proto__.constructor.__proto__)//function Empty(){} alert(Person.prototype.constructor.__proto__.constructor.__proto__.constructor);//function Function(){[native code]} //无线循环 </script>