为了账号安全,请及时绑定邮箱和手机立即绑定

prototype相同值覆盖问题?

function a(){

  this.name="a";

}

var x=new a();

a.prototype={

  name1:"b"

}

var y=new a();

console.log(x);

console.log(y);

a.prototype={

  name:"b"

}

var z=new a();

console.log(z);

运行结果:

http://img1.sycdn.imooc.com//5522ab800001d5ac05050174.jpg

问题:(1)为什么是prototype不是覆盖而是name 属性和name1属性叠加

    (2)同名时为什么是name,出现而不是name1

    (3)输出为什么是a {xxx}和Object {xxxx}为什么输出格式不一样,一个是a,一个数Object

正在回答

3 回答

(1)为什么是prototype不是覆盖而是name 属性和name1属性叠加

输出的name属性是你在构造器,也就是function a里面的this.name赋值导致的。而对象的原型(也就是a.prototype)在替换为{name1:"b"}以后,上已经没有name了。

(2)同名时为什么是name,出现而不是name1

没懂你想问啥,name和name1本来就是2个名字。

(3)输出为什么是a {xxx}和Object {xxxx}为什么输出格式不一样,一个是a,一个数Object

这是console内部的实现逻辑,在Chrome里面依然都是a。

可能Firefox下输出时,判断了对象constructor,发现是a函数,所以认为是a的实例,所以显示了a。

2 回复 有任何疑惑可以回复我~
#1

csbin 提问者

谢谢,“同名时为什么是name,出现而不是name1”我的问题表达有点问题,我是想问: 将a.prototype改为{ name: "b"; }时,输出是 name:"a";而不是name:"b";
2015-04-08 回复 有任何疑惑可以回复我~
#2

arlenhui 回复 csbin 提问者

原型链我的理解是对象的一个子对象,反正大家都可以用就对了。所以你的代码上就有了a.name="a",a.prototype.name="b",所以你说同名是输出的其实是a.name不是a.prototype.name。所以是a不是b,不然你试试console.log(z.prototype.name)试试
2015-05-12 回复 有任何疑惑可以回复我~
#3

arlenhui 回复 csbin 提问者

原谅我还没搞清楚就大声说话。我再研究研究
2015-05-12 回复 有任何疑惑可以回复我~
#4

arlenhui 回复 csbin 提问者

我明白了,相同名字的构造函数优先,所以是构造函数的name,想取到原型上的,不是用z.prototype.name,原谅我想当然了,而是用z.__proto__.name。注意proto两边是两个_而不是一个。希望可以帮助到你
2015-05-12 回复 有任何疑惑可以回复我~
查看1条回复

老师已回答1,3问题,我来回答一下第2个问题:

function a(){

  this.name="a";

}

a.prototype={

  name:"b"

}

var z=new a();

z.hasOwnProperty('name')//true    在new的时候相当于在name=“a”属性就挂载在z对象上,而a.prototype={name:"b"}是在原型链上。所以在本身找到name = “a”,就不会往上到原型链上找同名name=“b”(除非不同名)。


0 回复 有任何疑惑可以回复我~

new 构造出来的函数不存在prototype这个属性象(所以x木有prototype属性),y和z手动添加了prototype这个属性。x木有prototype属性,所以没显示;y新增了prototype属性,增加了name1;z修改prototype属性,将name替换了原来的name1。

所以:

第一个问题:prototype是覆盖

第二个问题:以上例子的prototype属性没有同名。

第三个问题:输出形式虽然是a {xxx}和Object {xxxx},但是他们的类型都是object(你可以使用console.log(typeof x)试试) 至于为什么显示的形式不一样,我猜测应该是加了prototype属性和没加prototype的原因

0 回复 有任何疑惑可以回复我~
#1

csbin 提问者

你的回答我一个也不认可,x没有name属性,name是原型中的,“y新增了prototype属性,增加了name1这话”我不认可,
2015-04-07 回复 有任何疑惑可以回复我~
#2

不断滴自我催眠 回复 csbin 提问者

那就共同期待大神解答吧
2015-04-07 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281102    人
  • 解答问题       1020    个

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

进入课程

prototype相同值覆盖问题?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信