javascript - ¿Cuáles son los matices del alcance prototípico/herencia prototípica en AngularJS?




ng-model (2)

La página del Ámbito de referencia de la API dice:

Un ámbito puede heredar de un ámbito primario.

La página Ámbito de la Guía del desarrollador dice:

Un ámbito (prototípicamente) hereda propiedades de su ámbito principal.

Entonces, ¿un ámbito secundario siempre se hereda prototípicamente de su ámbito primario? ¿Hay excepciones? Cuando se hereda, ¿es siempre la herencia prototípica de JavaScript normal?


De ninguna manera quiero competir con la respuesta de Mark, pero solo quería resaltar la pieza que finalmente hizo que todo hiciera clic como alguien nuevo en la herencia de Javascript y su cadena de prototipos .

Sólo las lecturas de propiedades buscan en la cadena del prototipo, no las escrituras. Así que cuando te pones

myObject.prop = '123';

No busca la cadena, pero cuando lo pones

myObject.myThing.prop = '123';

se está realizando una lectura sutil dentro de esa operación de escritura que intenta buscar myThing antes de escribir en su prop. Por eso es que escribir en object.properties del hijo obtiene en los objetos del padre.


Me gustaría agregar un ejemplo de herencia prototípica con javascript a la respuesta de @Scott Driscoll. Usaremos un patrón de herencia clásico con Object.create () que es parte de la especificación EcmaScript 5.

Primero creamos la función de objeto "Padre"

function Parent(){

}

Luego agregue un prototipo a la función de objeto "Padre"

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

Crear la función de objeto "Child"

function Child(){

}

Asignar prototipo secundario (Hacer prototipo secundario heredado del prototipo principal)

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

Asignar el constructor de prototipo "Niño" adecuado

Child.prototype.constructor = Child;

Agregue el método "changeProps" a un prototipo secundario, que reescribirá el valor de la propiedad "primitiva" en el objeto secundario y cambiará el valor de "object.one" tanto en el objeto primario como en el primario.

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

Inicia los objetos Padre (papá) y Niño (hijo).

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

Método de cambio de hijo de Call (hijo)

son.changeProps();

Revisa los resultados.

La propiedad primitiva padre no cambió

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

Propiedad primitiva del niño cambiada (reescrita)

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

Se modificaron las propiedades del objeto primario y secundario.

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

Ejemplo de trabajo aquí http://jsbin.com/xexurukiso/1/edit/

Más información sobre Object.create aquí https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create





prototypal-inheritance