更简单的原型语法(5.2.1)

更简单的原型语法的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象

<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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值