1
votes

la modification de la valeur dans le prototype ne fonctionne pas en JavaScript

Je suis nouveau dans JS, voyons mon code ci-dessous.

Je veux changer la valeur de la propriété des jambes de la souris à 2 lors de l'utilisation de proto mais je ne peux pas la changer. Tout ce que j'obtiens en sortie est de 4. Veuillez expliquer pourquoi?

function Animal() {
  this.legs = 4;
}

var mouse = new Animal();

mouse.__proto__.legs = 2;
console.log(mouse.legs);


6 commentaires

Ce n'est pas la bonne dupe, je pense que celle-ci fonctionnerait bien que les stackoverflow.com/questions/14379208/... . La propriété legs sur l'objet d'instance lui-même remplace la propriété legs sur le prototype


C'est parce que la jambe dont vous parlez est une propriété autonome et non un prototype.


lors de l'utilisation de proto - pourquoi?


@Rajesh donc même si vous ajoutez la souris .__ proto __. Legs = 2; ne fait aucune propriété de jambes sur le prototype? ou il ajoute? mais n'est pas accessible à partir du prototype parce que le navigateur a trouvé la propriété des pattes de la souris sur lui-même et c'est pourquoi ne pas entrer dans la chaîne de prototypes pour rechercher les pattes proprement, j'ai raison?


@Archer juste parce que je me dirige vers des prototypes dans JS.


__proto__ est obsolète , utilisez Object.getPrototypeOf () . Rajesh a votre réponse: mouse.legs accède à la propriété legs de mouse , pas à son [[Prototype]] . La résolution de propriété commence au niveau de l'objet et ne remonte la chaîne du prototype que si aucune propriété propre n'est trouvée.


3 Réponses :


0
votes

Comme indiqué, la jambe à laquelle vous essayez d'accéder est une propriété indépendante et non sur un prototype.

Voici un exemple:

function Animal() { this.legs = 4; }
function Reptile() { this.legs = 4; }

Reptile.prototype = new Animal();
var mouse = new Reptile();
console.log('Mouse details : ', mouse.legs, mouse.__proto__.legs);

var snake = new Reptile();
snake.leg = 0;
console.log('Snake details : ', snake.legs, snake.__proto__.legs);

snake.__proto__.legs = 0;

console.log('After mutation')

console.log('Mouse details : ', mouse.legs, mouse.__proto__.legs);
console.log('Snake details : ', snake.legs, snake.__proto__.legs);

Cela dit, si vous souhaitez avoir une implémentation de concept de remplacement, souvenez-vous toujours de ne jamais muter / modifier la propriété sur le prototype.

L'idée est d'avoir une propriété commune sur le prototype et avoir une propriété personnalisée sur soi.

Voici un exemple illustrant la même chose:

function Animal() {
  this.legs = 4;
}
Animal.prototype.legs = 8;
var mouse = new Animal();

mouse.legs = 2;
console.log(mouse.legs, mouse.__proto__.legs);

Pour faire simple, tout dans JS est un objet. Lorsque vous créez un objet, il a 2 niveaux imbriqués par défaut:

-> this
-> __proto__

Toute propriété de votre constructeur va à this . Toute propriété de son prototype va à __proto__ . Puisque tous les objets sont hérités de Object , il existe une chaîne jusqu'à l'objet global.


2 commentaires

En d'autres termes, il s'agit de la chaîne de portée


Exactement! Il ne s'agit que de ça



1
votes

Vous ne pouvez pas modifier la propriété d'occurrence de cette façon.

mouse .__ proto__ contient la fonction constructeur Animal .

Si vous ne voulez changer que les jambes de la souris, vous devez le faire de cette façon: mouse.legs = 2

Si vous voulez changer tous les futurs animaux, vous ne pouvez malheureusement pas. new Animal () fera toujours référence à la fonction constructeur d'origine.

Lorsque vous appelez new Animal , le moteur JS ne fait pas référence à Animal.prototype.constructor , il utilise Animal comme constructeur function et Animal.prototype comme prototype de l'objet nouvellement créé, en ignorant Animal.prototype.constructor .


0 commentaires

0
votes

Tous les objets JavaScript héritent des propriétés et des méthodes d'un prototype. Une fois hérité, vous pouvez directement l'appeler ou en modifier la valeur.

function Animal() {
  this.legs = 4;
}

var mouse = new Animal();

// mouse.__proto__.legs = 2;
//instead do this
mouse.legs = 2;
console.log(mouse.legs);


0 commentaires