javascript - org - Quais são as nuances do escopo protótipo/herança prototípica no AngularJS?




learn angular (2)

A página Escopo de referência da API diz:

Um escopo pode herdar de um escopo pai.

A página Escopo do Guia do desenvolvedor diz:

Um escopo (prototipicamente) herda propriedades de seu escopo pai.

Então, um escopo filho sempre herda protótipo de seu escopo pai? Existem exceções? Quando isso herda, é sempre normal a herança prototípica do JavaScript?


Eu não quero competir com a resposta de Mark, mas apenas queria destacar a peça que finalmente fez tudo clicar como alguém novo na herança do Javascript e sua cadeia de protótipos .

Somente a propriedade lê pesquisa na cadeia de protótipos, não em gravações. Então, quando você definir

myObject.prop = '123';

Não procura a corrente, mas quando você ajusta

myObject.myThing.prop = '123';

Há uma leitura sutil acontecendo nessa operação de gravação que tenta procurar em myThing antes de escrever para o seu prop. É por isso que escrever para object.properties da criança é obtido nos objetos do pai.


Gostaria de adicionar um exemplo de herança prototípica com javascript à resposta do @Scott Driscoll. Usaremos o padrão de herança clássica com Object.create (), que faz parte da especificação do EcmaScript 5.

Primeiro criamos a função de objeto "Pai"

function Parent(){

}

Em seguida, adicione um protótipo à função de objeto "Pai"

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

Criar função de objeto "filho"

function Child(){

}

Atribuir protótipo filho (Protótipo filho herdar do protótipo pai)

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

Atribuir o construtor de protótipo "filho" adequado

Child.prototype.constructor = Child;

Adicione o método "changeProps" a um protótipo filho, que irá reescrever o valor da propriedade "primitiva" no objeto Child e alterar o valor "object.one" nos objetos Child e Parent

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

Inicie os objetos Pai (pai) e Filho (filho).

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

Chamar método changeProps Child (filho)

son.changeProps();

Verifique os resultados.

Propriedade primitiva principal não foi alterada

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

Propriedade primitiva filho alterada (reescrita)

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

Propriedades object.one pai e filho alteradas

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

Exemplo de trabalho aqui http://jsbin.com/xexurukiso/1/edit/

Mais informações sobre Object.create aqui https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create





prototypal-inheritance