{ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}} 是对象,对象总是被引用的,因此
obj.prototype 确实是对 fn.prototype的引用,但是fn.prototype本身也是在引用对象。
因此,第一段中fn.prototype=null;仅仅是解除了fn.prototype对对象{ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}}的引用,所以obj不受影响。但是第二段你通过fn.prototype修改了对象{ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}}的值,obj当然被影响了。
换个写法你就明白了
var data = {attr1: "aaa"};
function fn(){}
fn.prototype = data;
var obj = new fn();
这个时候fn.prototype引用了data, obj也引用了data。
vsr obj = new fn()之后和fn没什么关系了。obj是用fn创建的新对象。
如果在fn.prototype=null;之后再
var newObj = new fn(),这时候newObj就没有attr1,attr2...了。