今天在群里无意中看到这样一个问题,就是原型中某些类型是否可共享问题。
还是直接上代码说事儿吧。
function A(){}; A.prototype = { abc:{ abc:456 }, d:"tom", e:789, set:function(){ this.abc.abc = 456789; this.d = "john"; this.e++ }, get:function(){ console.log(this.abc.abc); console.log(this.d); console.log(this.e) } };
大意是这样的,创建了一个构造函数A,然后给A添加了一些原型属性和方法。首先是给A添加了一个原型属性abc,其值为一个对象{abc:456},对象的属性为abc,属性值为456,然后又添加了两个属性d和e,d的值为字符串"tom",e的值为数值型789,紧接着是给A添加了两个方法set方法和get方法,一个方法是重新设置A的原型属性abc、d、e的值,然后另个一方法则是获取这些值。
现在实例化函数A。
var a = new A(); var b = new A();
因此现在a、b分别继承了函数A的原型属性和方法。
首先我要做的是获取函数A的原型属性的属性值。因此我的做法是先调用get方法。
(1)、调用a.get() 方法。不出意外的话,得到的结果应该是456 tom 789,经测试后结果确实是这样。
(2)紧接着进行第2步,执行a.set() 方法,然后再次执行a.get()方法。那么结果应该为456789 john 790,经测试,结果也是对的。
(3)以上都没什么问题,现在进行第3步,执行b.get()方法,那么问题来了。
按照原型的属性继承,此刻得到的结果应该是456789 john 790 才对啊,很遗憾,此刻得到的结果是456789 tom 789,可以看出,只有属性abc继承过来了,而属性d、e并没有继承。
这是怎么回事了,为什么属性abc继承过来了,而d、e则没有继承过来呢?紧接着,我把第3步换了一下,我先执行b.set()方法,然后再执行b.get()方法,此刻得到的结果才是我们原本想得到的结果。456789 tom 789
这是为什么呢?查过许多资料与多次测试后,得出的结论就是:引用类型被所有实例共享,而字符串型、数值型则不被共享