问答详情
源自:4-2 [JavaScript]创建对象、原型链

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://img.mukewang.com/5522ab800001d5ac05050174.jpg

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

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

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

提问者:csbin 2015-04-06 23:54

个回答

  • Bosn
    2015-04-08 15:38:19

    (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。

  • qq_恶魔_0
    2016-02-13 21:56:37

    老师已回答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”(除非不同名)。


  • 不断滴自我催眠
    2015-04-07 12:40:04

    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的原因