Lo que sucede con los prototipos es que puedes leer todo el día y no cambia la estructura subyacente de lo que apunta a qué. Sin embargo, la primera vez que realiza una tarea, está reemplazando, en esa instancia, a lo que apunta esa propiedad.
En su caso, en realidad no reasignó la propiedad del prototipo, modificó el valor de la estructura subyacente que se encontró en esa propiedad.
Lo que esto significa es que todos los objetos que comparten un prototipo de una realidad cuota de la implementación de A. Eso significa cualquier estado realizado en A se encuentran en todas las instancias de B. En el momento en que haces una misión a ese propiedad en una instancia de B, ha reemplazado efectivamente a lo que señala esa instancia (y solo esa instancia) (creo que esto se debe al hecho de que hay un nuevo "nombre" de propiedad en B que se golpea en la cadena de alcance, antes alcanza la implementación de "nombre" en A).
EDIT:
Para dar un ejemplo más explícito de lo que está pasando en:
B.prototype = new A();
var obj1 = new B();
Ahora, la primera vez que hacemos una lectura, el intepreter hace algo como esto:
obj1.name;
Intérprete: "Necesito el nombre de la propiedad. Primero, marque B. B no tiene 'nombre', así que continuemos por la cadena de alcance. Luego, A. Aha! A tiene 'nombre', devuelva ese"
Sin embargo, cuando se escribe, el intérprete en realidad no se preocupa por la propiedad heredada.
obj1.name = "Fred";
intérprete: "Necesito asignar a la propiedad 'nombre' que estoy dentro del alcance de esta instancia de B, por lo asigno 'Fred' a B. Pero dejo todo lo demás más abajo en la. cadena de ámbito sola (es decir, a) "
Ahora, la próxima vez que hagas una lectura ...
obj1.name;
intérprete:".! necesito propiedad 'nombre' Aha este ejemplo de B tiene la propiedad 'nombre' ya está en ella. Solo devuelva eso - No me importa el resto de la cadena de ámbito (es decir, A.name) "
Por lo tanto, la primera vez que escriba un nombre, lo insertará como una propiedad de primera clase en la instancia, y ya no le importa lo que está en AAname es todavía hay, está más abajo en la cadena de alcance, y el intérprete JS no llega tan lejos antes de encontrar lo que estaba buscando.
If " nombrar" tenía un valor predeterminado en un (a medida que tenemos, que es 'a'), entonces se podría ver este comportamiento:
B.prototype = new A();
var obj1 = new B();
var obj2 = new B();
obj1.name = "Fred";
alert(obj1.name); // Alerts Fred
alert(obj2.name); // Alerts "A", your original value of A.name
Ahora, en el cas e de su matriz, en realidad nunca reemplazó la lista en la cadena de alcance con una nueva matriz. Lo que hizo fue tomar un control en la matriz en sí, y le agregó un elemento. Por lo tanto, todas las instancias de B se ven afectadas.
Intérprete: "Necesito obtener la 'lista' como corresponde y agregarle un elemento. Al revisar esta instancia de B ... no, no tiene una propiedad de 'lista'. Siguiente en la cadena de alcance: A Sí., A tiene 'lista', el uso que Ahora, empuje en esa lista"
esto no ser el caso si usted hizo esto:.
obj1.list = [];
obj1.push(123);
Gracias a todos por las explicaciones. Entonces, a pesar de que dice: B.prototype = new A(); y obj2 = new B(); La propiedad "list" de A() no se está creando de nuevo, solo se recicla. De todos modos, puedo aceptar este destino :) Entonces, ¿cuál es la mejor manera de tener una clase base que contiene una matriz? Estoy construyendo un árbol y necesito una clase genérica de nodo con niños. – med
Muy buena explicación. –