`
weigang.gao
  • 浏览: 491184 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

更简单的原型语法(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>

 

分享到:
评论

相关推荐

    Hibernate5.2.11高清版,最新版本

    模式生成(Schema generation)描述了如何利用Hibernate自动生成数据库模式,这对于快速原型开发非常有用。 持久化上下文(PersistenceContexts)介绍了Hibernate管理对象生命周期的机制,以及如何在应用中处理这些...

    ECMAScript 2018快速入门 高清完整PDF

    5.2.1数据类型 42 5.2.2数组缓冲区 43 5.2.3数据视图 43 5.2.4类型化数组即视图 45 5.2.5类型化数组与数组的主要区别 45 5.3小结 46 第6章对象 47 6.1属性简写 47 6.2方法简写 47 6.3未定的属性名和方法名 48 6.4新...

    Thinking in Java 中文第四版+习题答案

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写样式...

    Think in Java(中文版)chm格式

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 ...

    JAVA_Thinking in Java

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    Java初学者入门教学

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    ThinkInJava

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    java 编程入门思考

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    thinkinjava

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    Thinking in Java简体中文(全)

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    java联想(中文)

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    Perl 语言编程

    它最初由 Larry Wall 在 1987 年设计并发布,其设计目标是提供一种比传统 Unix 工具更强大的编程工具。Perl 支持多种编程范式,包括过程式、函数式以及面向对象编程。 **1.2 自然语言与人工语言** Perl 被设计成...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI有害吗 16.9 总结 16.10 练习 第17章 项目 17.1 文字处理 17.1.1 提取代码列表 17.1.2 检查大小写...

    Node.js MongoDB AngularJSWeb开发中文版.part1

    2.7.3 使用原型对象模式 24 2.8 处理字符串 25 2.8.1 合并字符串 26 2.8.2 在字符串中搜索子串 26 2.8.3 在一个字符串中替换单词 27 2.8.4 将字符串分割成数组 27 2.9 使用数组 27 2.9.1 合并数组 28 2.9.2 遍历数组...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/r)   6.4.4 unicode字符串操作符(u/u)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型函数   6.5.3 字符串类型函数...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/r)   6.4.4 unicode字符串操作符(u/u)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型函数   6.5.3 字符串类型函数...

    Python核心编程第二版

     6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/R)   6.4.4 Unicode字符串操作符(u/U)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型函数   6.5.3 字符串类型函数...

Global site tag (gtag.js) - Google Analytics