JS教程:学习笔记之JS类
o
这不是bug,而且各个浏览器里都一样。原因分析如下:
Person.prototype = { mark:''Person.Proto'' } 一段首先创建一个对象字面量,并且赋值给Person.prototype,我们称这个对象字面量为Proto。
var nahao = new Person(''Top css'',male,1989,''www.javava.org'');
在创建nahao对象并且按照构造函数初始化对象的同时,会悄悄给nahao对象设置一个内部属性,我们暂且将其命名为xxx,并且将其赋值为Person.prototype的值,也就是上面提到的对象字面量Proto,JavaScript的动态继承也就是由这个xxx实现的。(这个JavaScript的内部实现机制不是我拍脑门想出来的,是Netscape的工作人员的一篇文章里提到的,下面也会用程序来证明这个流程。)然后,
Person.prototype = { mark:''Person.NewProto'' }
这里我们将创建另外一个对象字面量NewProto,并且赋值给Person.prototype。到这里就很明显了,尽管我们修改了 Person.prototype,但是并没有影响到nahao对象。当我们访问nahao.mark的时候,它首先在自己内部找,找不到就会去找xxx,自然就找到了Proto,而非NewProto。那么xxx这个实现动态继承的关键究竟是什么呢?在FireFox中它是__proto__,有以下代码为证。至于在IE中xxx是什么我还没找到。
Person.prototype = { mark:''Person.Proto'' } var nahao = new Person(''Topcss'',''male'',1989,''www.nahao8.com''); nahao.prototype = { mark:''Person.NewProto'' } alert(nahao.mark); alert(nahao.__proto__.mark);//两次alert的结果都是一样的,都是Proto。
alert(nahao.__proto__===Person.prototype);//结构为true。
以上代码经过测试适用于FireFox和chrome。NetScape应该也可以,IE不行。 个人观点:Person.prototype = {}的方式最好只在定义构造函数的时候使用一次,而且要紧跟着构造函数写,以后修改prototype的时候都使用Person.prototype.protertyA = ‘valueA’的形式。
10、 最后的构造函数我们在上面看到了定义对象,以及设这和修改其属性的各种方法,我们可以在构造函数中定义属性,可以在对象外部定义(静态)属性,也可以在对象的prototype中定义属性。下面是我使用的大致格式:
function Person(nameArg,genderArg,yearOfBirthArg,siteArg,privacyArg){ //公有属性 this.name = nameArg; this.gender = |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |