国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - 修改實(shí)例屬性對(duì)修改前已輸出到控制臺(tái)的內(nèi)容也有影響?
過去多啦不再A夢(mèng)
過去多啦不再A夢(mèng) 2017-05-19 10:35:27
0
3
624

不是原型動(dòng)態(tài)性的問題,是控制臺(tái)的問題
先貼上我的程式碼

function Father(){
    this.colors = ["red", "green", "blue"],
    this.sayColor = function(){
    console.log(this.colors);
    };
}
function Child(){}
Child.prototype = new Father();

var child1 = new Child();
child1.sayColor(); // ["red", "green", "blue"] 原始值

child1.colors.push("black"); // 屬性修改
var child2 = new Child();
child2.sayColor(); // ["red", "green", "blue", "black"]
child1.sayColor(); // ["red", "green", "blue", "black"]

註解為正常運(yùn)作的結(jié)果,但若在瀏覽器裡(Firefox和Chrome)打開,控制臺(tái)會(huì)傳回3個(gè)相同的陣列:

以及

點(diǎn)擊刷新頁(yè)面後,返回正常的結(jié)果;
或?qū)?code>console.log改為alert,打開頁(yè)面即返回正常的結(jié)果;
因?yàn)镮E每次都需要手動(dòng)載入腳本,相當(dāng)於刷新了一次頁(yè)面,所以結(jié)果正常;
所以我覺得,是不是控制臺(tái)輸出結(jié)果的方式和我想的不一樣?求解答。

過去多啦不再A夢(mèng)
過去多啦不再A夢(mèng)

全部回覆(3)
洪濤

我也遇到這樣的問題,以下是我提出的問題:
/q/10...

如果你不想看,總的來說console.log 是有惰性求值的問題!

先說結(jié)論:console.log 是不可靠的由於它並非標(biāo)準(zhǔn)裡確定的 API,所以瀏覽器的實(shí)作是沒有標(biāo)準(zhǔn)可言的。有時(shí)候會(huì)出現(xiàn)同步的 console.log 與非同步的 console.log 的困惑,也有立刻求值的 console.log 和惰性求值的 console.log 的差異。你遇到的是後者。

補(bǔ)充參考:http://stackoverflow.com/ques...

Peter_Zhu

好吧,問題中已經(jīng)說明不是原型問題,是控制臺(tái)問題。 敲了這麼多字,覺得還有點(diǎn)價(jià)值,沒捨得刪...
以下解釋與提問者所想知道的不一致。
我回答的是: 為什麼實(shí)例物件的屬性變更會(huì)影響另外一個(gè)實(shí)例?
權(quán)當(dāng)給對(duì)原型繼承理解不清的人一個(gè)解釋。

我的Chrome(Mac平臺(tái)下,版本57.0.2987)並沒有出現(xiàn)你說的問題,輸出結(jié)果和期望一致:

  • 第一個(gè)輸出: ["red", "green", "blue"]

  • 第二個(gè)輸出: ["red", "green", "blue", "black"]

  • 第三個(gè)輸出: ["red", "green", "blue", "black"]

解答問題前,請(qǐng)看一個(gè)範(fàn)例, 可以解釋你遇到的問題。

var father_colors = ["red", "green", "blue"];
var child1_colors = father_colors

console.log(child1_colors);  // ["red", "green", "blue"] 原始值

child1_colors.push("black");
var child2_colors = father_colors;

console.log(child2_colors);  // ["red", "green", "blue", "black"]
console.log(child2_colors);  // ["red", "green", "blue", "black"]

原因

好,現(xiàn)在回到你的問題: 為什麼改了child1實(shí)例的屬性,確影響到了child2?

  1. 建立實(shí)例後,實(shí)例的 __proto__ 屬性會(huì)指向父類別的 .prototype 屬性, 記住是一個(gè)指向(引用)而不是複製!

  2. 存取實(shí)例屬性時(shí),先在實(shí)例自己身上找,如果沒有找到,透過__proto__屬性去父類的prototype屬性中尋找: child1.colors 指向Father.prototype.colors, 因此對(duì)colors的操作會(huì)直接影響父類別中的引用物件。

  3. child2.colors 也會(huì)去找 Father.prototype.colors, 結(jié)果自然就是child1修該colors之後的結(jié)果。

怎樣避免?

child1.colors你重新賦值而不是直接操作,就不會(huì)有問題。 (記住,對(duì)父類別中的引用類型屬性都不要直接操作?。?/p>

child1.colors = ["red", "green", "blue", "black"];
// 或者用
child1.colors = child1.colors.concat().push["black"];  //concat()方法復(fù)制了一份父類的colors數(shù)組。
滿天的星座

自答一個(gè):
正如採(cǎi)納答案所說,是console.log的惰性求值問題;console.log的惰性求值問題;
當(dāng)輸出的內(nèi)容為引用類型中的ArrayObject當(dāng)輸出的內(nèi)容為引用類型中的ArrayObject時(shí),很有可能會(huì)出現(xiàn)問題中的情況;

目前我看到的最佳解決方法是:
將輸出的內(nèi)容改為console.log(JSON.stringify(yourArray));console.log(JSON.stringify(yourArray))
不會(huì)改變輸出的類型和內(nèi)容,卻規(guī)避了console.log不會(huì)改變輸出的類型和內(nèi)容,卻規(guī)避了console.log的惰性求值問題;

最後感謝所有回答者!

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板