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);
3 Réponses :
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.
En d'autres termes, il s'agit de la chaîne de portée
Exactement! Il ne s'agit que de ça
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
.
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);
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 prototypeC'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 , utilisezObject.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.