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);
運行結(jié)果:
問題:(1)為什么是prototype不是覆蓋而是name 屬性和name1屬性疊加
? ? (2)同名時為什么是name,出現(xiàn)而不是name1
? ? (3)輸出為什么是a {xxx}和Object {xxxx}為什么輸出格式不一樣,一個是a,一個數(shù)Object
2015-04-08
(1)為什么是prototype不是覆蓋而是name 屬性和name1屬性疊加
輸出的name屬性是你在構(gòu)造器,也就是function a里面的this.name賦值導(dǎo)致的。而對象的原型(也就是a.prototype)在替換為{name1:"b"}以后,上已經(jīng)沒有name了。
(2)同名時為什么是name,出現(xiàn)而不是name1
沒懂你想問啥,name和name1本來就是2個名字。
(3)輸出為什么是a {xxx}和Object {xxxx}為什么輸出格式不一樣,一個是a,一個數(shù)Object
這是console內(nèi)部的實現(xiàn)邏輯,在Chrome里面依然都是a。
可能Firefox下輸出時,判斷了對象constructor,發(fā)現(xiàn)是a函數(shù),所以認為是a的實例,所以顯示了a。
2016-02-13
老師已回答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
new 構(gòu)造出來的函數(shù)不存在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)試試) 至于為什么顯示的形式不一樣,我猜測應(yīng)該是加了prototype屬性和沒加prototype的原因