第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

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é)果:

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

問題:(1)為什么是prototype不是覆蓋而是name 屬性和name1屬性疊加

? ? (2)同名時為什么是name,出現(xiàn)而不是name1

? ? (3)輸出為什么是a {xxx}和Object {xxxx}為什么輸出格式不一樣,一個是a,一個數(shù)Object

正在回答

3 回答

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

2 回復(fù) 有任何疑惑可以回復(fù)我~
#1

csbin 提問者

謝謝,“同名時為什么是name,出現(xiàn)而不是name1”我的問題表達有點問題,我是想問: 將a.prototype改為{ name: "b"; }時,輸出是 name:"a";而不是name:"b";
2015-04-08 回復(fù) 有任何疑惑可以回復(fù)我~
#2

arlenhui 回復(fù) csbin 提問者

原型鏈我的理解是對象的一個子對象,反正大家都可以用就對了。所以你的代碼上就有了a.name="a",a.prototype.name="b",所以你說同名是輸出的其實是a.name不是a.prototype.name。所以是a不是b,不然你試試console.log(z.prototype.name)試試
2015-05-12 回復(fù) 有任何疑惑可以回復(fù)我~
#3

arlenhui 回復(fù) csbin 提問者

原諒我還沒搞清楚就大聲說話。我再研究研究
2015-05-12 回復(fù) 有任何疑惑可以回復(fù)我~
#4

arlenhui 回復(fù) csbin 提問者

我明白了,相同名字的構(gòu)造函數(shù)優(yōu)先,所以是構(gòu)造函數(shù)的name,想取到原型上的,不是用z.prototype.name,原諒我想當然了,而是用z.__proto__.name。注意proto兩邊是兩個_而不是一個。希望可以幫助到你
2015-05-12 回復(fù) 有任何疑惑可以回復(fù)我~
查看1條回復(fù)

老師已回答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 回復(fù) 有任何疑惑可以回復(fù)我~

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

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

csbin 提問者

你的回答我一個也不認可,x沒有name屬性,name是原型中的,“y新增了prototype屬性,增加了name1這話”我不認可,
2015-04-07 回復(fù) 有任何疑惑可以回復(fù)我~
#2

不斷滴自我催眠 回復(fù) csbin 提問者

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

舉報

0/150
提交
取消
JavaScript深入淺出
  • 參與學習       281098    人
  • 解答問題       1048    個

由淺入深學習JS語言特性,且解析JS常見誤區(qū),從入門到掌握

進入課程

prototype相同值覆蓋問題?

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號