Question

function Entity() {
    this.a = {a: 4};
    this.b = 5;
}

function Thing() {}
Thing.prototype = new Entity;

var thing1 = new Thing;
thing1.a.a = 3;
thing1.b = 4;
var thing2 = new Thing;
console.log(thing2.a.a); // prints 3 instead of 4. I would like 4.
console.log(thing2.b) // prints 5 as wanted

Je vais avoir du mal à établir l'héritage prototypique en javascript. Idéalement, je veux les deux Thing1 et thing2 d'avoir leur propre copie propre du « nouveau prototype entité ».

à l'aide this.__proto__ est quelque chose que je veux éviter

[Modifier]

J'ai une idée approximative de la façon dont ce travail.

Réglage thing1.b définit la propriété b sur l'instance chose. qui ne touche pas le Entity.b défini dans la chaîne de prototype.

Où que la mise en thing1.a.a sur l'instance de chose ne peut être fait parce qu'il jetterait un « ne peut pas définir un sur undefined » erreur. C'est quand il monte la chaîne de prototype pour trouver entité.Système qui est défini et fixe Entity.a.a à une nouvelle valeur.

[plus Modifier]

Comme @IvoWetzel dit la mise en thing1.b ne touche pas la chaîne de prototype, car la définition des propriétés ne fonctionne pas. Où que la mise en thing1.a.a fait deux étapes. A getter sur thing1.a qui touche la chaîne de prototype suivie d'un poseur de .a

Était-ce utile?

La solution

Une chose que vous pouvez faire est de Appliquer la logique de votre constructeur Entity à l'intérieur Thing, par exemple:

function Entity() {
    this.a = {a: 4};
    this.b = 5;
}
Entity.prototype.c = 6;

function Thing() {
  Entity.apply(this, arguments); // ejecutes the assignments made in Entity
}
Thing.prototype = new Entity;

var a = new Thing;
a.a.a = 3;

var b = new Thing;
console.log(a.a.a); // 3
console.log(b.a.a); // 4

console.log(a.b);   // 5
console.log(b.b);   // 5

console.log(a.c);   // 6
console.log(b.c);   // 6

Autres conseils

Alors que la CMS a affiché une solution, pourquoi le retour de thing2.b 5 et pourquoi resolve thing2.a.a à l'objet?

var thing1 = new Thing;

// thing1 has no a, but the prototype has so a.a is essentially the a of Entity
thing1.a.a = 3;

// Sets b on thing1, setting does not go up the prototype chain(!)
thing1.b = 4;  

// that's what thing1 looks like
Thing {proto: Entity { 
                      a: { <--- gets resolved 
                          a: 3 <-- gets set
                      }, 
                      b: 5
              },
              b: 4 <-- gets set directly
      }


var thing2 = new Thing;

// thing2.a does not exist, so we look up the prototype and find a on Entity
console.log(thing2.a.a); 

// thing2.b also does not exists, so once again we look up the prototype to find b on Entity
console.log(thing2.b);

// that's what thing2 looks like
Thing {proto: Entity {
                      a: {
                          a: 3 <- gets resolved
                      },
                      b: 5 <- gets resolved
              }
      }

Tout le problème est sur JavaScript monter la chaîne de prototype afin de trouver des biens immobiliers. Mais quand vous définissez les propriétés il ne pas monter la chaîne.

En effet, les objets JavaScript sont toujours traités comme des références.

Par conséquent, lorsque vous modifiez l'objet this.a en faisant a.a.a = 3; vous changez qu'un objet en mémoire. De nouvelles instances de Thing feront référence à ce même objet en mémoire parce que le constructeur Entity n'est pas appelé à chaque fois que Thing est, et l'objet this.a reste le même.

Je mis this.a en dehors de la chaîne de prototype, probablement directement dans le constructeur de Thing. Cela ferait en sorte qu'une nouvelle version de this.a est créé en mémoire tous les Thing temps est instancié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top