在创建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 = genderArg;
this.yearOfBirth = yearOfBirthArg;
this.site = siteArg;
//私有属性
var privacy = privacyArg;
//特权方法
this.showPrivacy = function(){
};
}
Person.prototype = {
//公有方法
info : function(){
},
func:function(){
}
}