更简单的原型语法的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象
<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>
相关推荐
模式生成(Schema generation)描述了如何利用Hibernate自动生成数据库模式,这对于快速原型开发非常有用。 持久化上下文(PersistenceContexts)介绍了Hibernate管理对象生命周期的机制,以及如何在应用中处理这些...
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新...
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 检查大小写样式...
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 ...
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 检查大小写...
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 检查大小写...
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 检查大小写...
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 检查大小写...
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 检查大小写...
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 检查大小写...
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 检查大小写...
它最初由 Larry Wall 在 1987 年设计并发布,其设计目标是提供一种比传统 Unix 工具更强大的编程工具。Perl 支持多种编程范式,包括过程式、函数式以及面向对象编程。 **1.2 自然语言与人工语言** Perl 被设计成...
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 检查大小写...
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 检查大小写...
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 遍历数组...
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 字符串类型函数...
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 字符串类型函数...
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 字符串类型函数...