Ce n'est pas un problème avec la dynamique du prototype, c'est un problème avec la console
Collez d'abord mon code
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"]
L'annotation est le résultat d'un fonctionnement normal, mais si elle est ouverte dans un navigateur (Firefox et Chrome), la console renverra 3 tableaux identiques :
et
Après avoir cliqué pour actualiser la page, les résultats normaux seront renvoyés ;
ou console.log
改为alert
, l'ouverture de la page renverra des résultats normaux
Parce qu'IE doit charger manuellement le script à chaque fois, ce qui équivaut à actualiser la page, les résultats sont donc normal ;
Donc, je pense que la façon dont la console affiche les résultats est différente de ce que je pense ? Demandez des réponses.
J'ai également rencontré un tel problème. Voici les questions que j'ai soulevées :
./q/10...
Si vous ne voulez pas le lire, d'une manière générale, console.log a un problème d'évaluation paresseuse !
Permettez-moi de commencer par la conclusion : console.log n'est pas fiable car ce n'est pas une API déterminée par la norme, il n'y a donc pas de norme pour l'implémentation du navigateur. Il existe parfois une confusion entre console.log synchrone et console.log asynchrone, ainsi que la différence entre console.log qui évalue immédiatement et console.log qui évalue paresseusement. Ce que vous rencontrez est ce dernier.
Référence supplémentaire : http://stackoverflow.com/ques...
Mon Chrome (sous plateforme Mac, version 57.0.2987) n'a pas le problème que vous évoquez, et les résultats de sortie sont conformes aux attentes :
Première sortie : ["rouge", "vert", "bleu"]
Deuxième sortie : ["rouge", "vert", "bleu", "noir"]
La troisième sortie : ["rouge", "vert", "bleu", "noir"]
Avant de répondre à la question, veuillez regarder un exemple pour expliquer le problème que vous rencontrez.
Raison
D'accord, revenons maintenant à votre question : Pourquoi la modification des attributs de l'instance child1 affecte-t-elle child2 ?
Après avoir créé une instance, l'attribut
__proto__
de l'instance pointera vers l'attribut .prototype de la classe parent. N'oubliez pas qu'il s'agit d'un pointeur (référence) et non d'une copie !Lorsque vous accédez aux attributs de l'instance, recherchez d'abord sur l'instance elle-même. Si elle n'est pas trouvée, accédez à l'attribut prototype de la classe parent via l'attribut __proto__ pour trouver : child1.colors pointe vers Father.prototype.colors, donc l'opération sur les couleurs. affectera directement l'objet de référence dans la classe parent.
child2.colors recherchera également Father.prototype.colors, et le résultat sera naturellement le résultat après que child1 aura réparé les couleurs.
Comment l'éviter ?
Si vous réaffectez child1.colors au lieu de l'utiliser directement, il n'y aura aucun problème. (N'oubliez pas, n'utilisez pas directement les attributs de type référence dans la classe parent !)
Répondez-vous :
Comme le dit la réponse acceptée, il s'agit d'un problème d'évaluation paresseux de
console.log
console.log
的惰性求值问题;当输出的内容为引用类型中的
Array
或Object
时,很有可能会出现问题中的情况;目前我看到的最佳解决方法是:
;将输出的内容改为
console.log(JSON.stringify(yourArray))
;不会改变输出的类型和内容,却规避了
console.log
Lorsque le contenu de sortie estArray
ouObject
, la situation de la question est susceptible de se produireLa meilleure solution que j'ai vue jusqu'à présent est :
Changez le contenu de sortie enconsole.log(JSON.stringify(yourArray))
#🎜🎜#No Changer le type; et le contenu de la sortie évite le problème d'évaluation paresseuse deconsole.log
#🎜🎜# ; #🎜🎜#Enfin, merci à tous ceux qui ont répondu ! #🎜🎜#