function People(name) { this.name = name; this.a = "dd"; } var people1 = new People("熊俊"); var people2 = new People("精华"); document.write(people1.name); document.write(people2.name); document.write(people1.a); document.write(people2.a);
上面的代码,两个实例不也是共享了a属性吗?为什么JavaSciript中要用prototype这个东西? [解决办法] 没有共享啊 每个对象都有一个a 只是值都是dd而已 就是每个对象都有一个值为dd的a 但未共享 你将people1的a重新赋值后people2的a不会跟着变的 [解决办法] function People(name) { this.name = name; this.a = "dd"; } var people1 = new People("熊俊"); var people2 = new People("精华"); people1.a="c"; document.write(people1.a); document.write(people2.a); [解决办法] 简单回答一下楼主一下这个:为什么JavaSciript中要用prototype这个东西? 不知道楼主知不知道什么叫原型继承: 举个简单例子: function f1(){ this.method1=function(){ return 'method1' } } f1.prototype.method2=function(){return 'method2'} var obj=new f1() 我理解的js,当js引擎读到new f1()时,其实是先new Object,即实例出了一个Object类的对象,然后这个空对象(其实不是空对象,它里面有一个constructor属性和String属性)原型继承了f1.prototype的一组对象,也可以说是这个空对象深拷贝了f1.prototype所指向的对象,如果你不理解啥叫深拷贝,我举个例子比如说m,n是两个对象, var m=new Object(); m.x=10 m.method1=function(){ return 'ok' } 如果说让n深拷贝m, 不是说让n=m, 这叫浅拷贝,浅拷贝的特点是m把对象在内存堆中的地址拷贝给n,也就是说m和n指向的是同样的对象,当m.x=100时,n.x也变为100,这并不是我希望的,我希望的是n和m是两个对象。那如何深拷贝呢? 方法如下: var m={}; m.x=1; m.method=function (){return 123} var n={}; for(shuxing in m){ n[shuxing]=m[shuxing] } alert(n.x) alert(n.method) 这时候改变m.x的时候,n.x不会同时发生改变,这就叫深拷贝。 这里有一点必须要清楚:在js中,一个变量类型是由变量的值决定,比如说: var a=1 它在内存的栈中存的就是a=1 如果var a=function(){ alert('ok') } 那么a在栈中存的是一个地址,这个地址指向的是堆中的function(){ alert('ok') }, 理解这个就应该明白上面m.method和n.method存的都是相同的地址,这个地址指向function (){return 123}