web-dev-qa-db-fra.com

Quelles sont les nuances de l'héritage prototypal / prototypique de la portée dans AngularJS?

La page de référence de l'API indique:

Une portée peut hériter d'une portée parent.

La page du manuel du développeur dit:

Une étendue (de manière prototypique) hérite des propriétés de sa portée parent.

Ainsi, une portée enfant hérite-t-elle toujours de manière prototypique de sa portée parent? Y a-t-il des exceptions? Quand il hérite, est-ce toujours un héritage prototypal JavaScript normal?

1010
Mark Rajcok

Je ne veux en aucun cas rivaliser avec la réponse de Mark, mais je voulais simplement mettre en valeur la pièce qui a finalement fait que tout clique comme quelqu'un de nouveau pour héritage Javascript et sa chaîne de prototypes .

Seule la lecture de propriété effectue une recherche dans la chaîne de prototypes, pas d'écriture. Ainsi, lorsque vous définissez

myObject.prop = '123';

Il ne regarde pas la chaîne, mais lorsque vous définissez

myObject.myThing.prop = '123';

Il y a une lecture subtile dans cette opération d'écriture qui tente de rechercher myThing avant d'écrire sur son accessoire. C’est pourquoi l’écriture sur object.properties de l’enfant a pour objet les objets du parent.

140
Scott Driscoll

J'aimerais ajouter un exemple d'héritage prototypique avec javascript à @Scott Driscoll answer. Nous allons utiliser un modèle d'héritage classique avec Object.create (), qui fait partie de la spécification EcmaScript 5.

Nous créons d'abord la fonction d'objet "Parent"

function Parent(){

}

Ajoutez ensuite un prototype à la fonction d'objet "Parent"

 Parent.prototype = {
 primitive : 1,
 object : {
    one : 1
   }
}

Créer une fonction d'objet "Enfant"

function Child(){

}

Affecter un prototype enfant (Faire en sorte que le prototype enfant hérite du prototype parent)

Child.prototype = Object.create(Parent.prototype);

Affecter le constructeur de prototype "Enfant" approprié

Child.prototype.constructor = Child;

Ajoutez la méthode "changeProps" à un prototype enfant, qui réécrira la valeur de la propriété "primitive" dans un objet enfant et modifiera la valeur "object.one" dans les objets enfant et parent

Child.prototype.changeProps = function(){
    this.primitive = 2;
    this.object.one = 2;
};

Initiez les objets parent (papa) et enfant (fils).

var dad = new Parent();
var son = new Child();

Appelez la méthode changeProps de l'enfant (fils)

son.changeProps();

Vérifiez les résultats.

La propriété primitive parent n'a pas changé

console.log(dad.primitive); /* 1 */

Propriété primitive enfant modifiée (réécrite)

console.log(son.primitive); /* 2 */

Propriétés object.one parent et enfant modifiées

console.log(dad.object.one); /* 2 */
console.log(son.object.one); /* 2 */

Exemple de travail ici http://jsbin.com/xexurukiso/1/edit/

Plus d'infos sur Object.create ici https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create

21
tylik