csbin
2015-04-06 23:54
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);
运行结果:
问题:(1)为什么是prototype不是覆盖而是name 属性和name1属性叠加
(2)同名时为什么是name,出现而不是name1
(3)输出为什么是a {xxx}和Object {xxxx}为什么输出格式不一样,一个是a,一个数Object
(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。
老师已回答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”(除非不同名)。
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的原因
JavaScript深入浅出
281111 学习 · 1020 问题
相似问题