var sss = {"a":1,"b":2};
function Demo(){}
Demo.prototype = sss;
var ss = new Demo();
ss.a = 13;
var s = new Demo();
console.log(s.a); //1
var o = {
name:[1,2,3,4]
};
function Demo1() {}
Demo1.prototype = o;
var oo = new Demo1();
oo.name.push(5);
var ooo = new Demo1();
console.log(ooo.name) //[1,2,3,4,5]
console.log(o);//[1,2,3,4,5]
第一个sss并没有改变,Demo的原型也没有改变,难道ss.a这个操作只是简单的对ss对象的赋值?
为什么第二个例子就变了,事实上改变了o,也改变了原型。
oo.name.push(5); ==> Demo1.prototype.name.push(5); 实例还能改变构造函数的原型?
Demo1.prototype = o; //就是原型被改变了,为什么o对象也会变,难道这边的= 不能看成赋值吗?
http://www.cnblogs.com/humin/p/4556820.html 或许能帮助你理解。
原型修改了我理解,可以o为什么也修改了
@铸剑师: 两个点:
1、在访问name属性时,由于实例属性没有name,所以访问到了原型对象上的name。
2、这个name是引用类型,操作oo的name,等于操作原型上的name,而o就是原型对象,也就操作到了o指向的那块内存。
@幻天芒: 那我可不可以理解为 Demo1.prototype = o 其实是指Demo1.prototype指向o,而不是单纯的赋值
@铸剑师: =号就是赋值,赋值也就是指向了。
@幻天芒: ok,谢谢
你把原型当作基类就好理解了,prototype的值相当于是基类,new出来的是对象。
你这里是用一个对象赋值给了prototype,所以它表现出来的行为既一个是类也是一个对象。
http://www.cnblogs.com/humin/p/4556820.html 或许能帮助你理解。
原型修改了我理解,可以o为什么也修改了