首页 新闻 会员 周边 捐助

我在看js的继承过程中有个问题,哪位帮忙指点下

0
悬赏园豆:50 [已解决问题] 解决于 2017-09-20 23:30
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对象也会变,难道这边的= 不能看成赋值吗?




铸剑师的主页 铸剑师 | 初学一级 | 园豆:147
提问于:2017-09-19 22:10
< >
分享
最佳答案
0

http://www.cnblogs.com/humin/p/4556820.html 或许能帮助你理解。

收获园豆:30
幻天芒 | 高人七级 |园豆:37205 | 2017-09-20 08:47

原型修改了我理解,可以o为什么也修改了

铸剑师 | 园豆:147 (初学一级) | 2017-09-20 20:25

@铸剑师: 两个点:

1、在访问name属性时,由于实例属性没有name,所以访问到了原型对象上的name。

2、这个name是引用类型,操作oo的name,等于操作原型上的name,而o就是原型对象,也就操作到了o指向的那块内存。

幻天芒 | 园豆:37205 (高人七级) | 2017-09-20 22:27

@幻天芒: 那我可不可以理解为  Demo1.prototype = o  其实是指Demo1.prototype指向o,而不是单纯的赋值

铸剑师 | 园豆:147 (初学一级) | 2017-09-20 23:07

@铸剑师: =号就是赋值,赋值也就是指向了。

幻天芒 | 园豆:37205 (高人七级) | 2017-09-20 23:11

@幻天芒: ok,谢谢

铸剑师 | 园豆:147 (初学一级) | 2017-09-20 23:29
其他回答(2)
0

你把原型当作基类就好理解了,prototype的值相当于是基类,new出来的是对象。

你这里是用一个对象赋值给了prototype,所以它表现出来的行为既一个是类也是一个对象。

收获园豆:10
Timetombs | 园豆:3959 (老鸟四级) | 2017-09-20 07:48
0

http://www.cnblogs.com/humin/p/4556820.html 或许能帮助你理解。

收获园豆:10
fcyh | 园豆:568 (小虾三级) | 2017-09-20 12:00

原型修改了我理解,可以o为什么也修改了

支持(0) 反对(0) 铸剑师 | 园豆:147 (初学一级) | 2017-09-20 20:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册