Bien, mi primer intento de intentar explicar lo que estaba haciendo falló miserablemente. Básicamente estoy copiando Crockford's Object.create(), excepto con variables privadas.Idea de herencia de Javascript (parte 2)
Si mira la respuesta aceptada aquí How to inherit from a class in javascript?, verá Object.create como el último patrón, que creo que se ajusta mejor a la naturaleza prototípica de Javascript (objetos engendrar objetos) en lugar de emular la herencia clásica (clases engendrar objetos) .
Si mira el artículo de Wikipedia sobre programación basada en prototipos (http://en.wikipedia.org/wiki/Prototype-based_programming), puede ver más de lo que quiero decir.
El inconveniente con Object.create() es que no hay soporte para miembros privados. Esto es lo que propongo:
Function.prototype.from = function(obj) {
function F() {this.parent = Object(obj);}
F.prototype = obj;
var out = new F();
this.apply(out);
return out;
};
A continuación, crear objetos como sigue:
// Create an object
var a = function() {
var private_property = 'blue';
this.public_property = 7;
this.public_method = function() {
alert(this.public_property + ' ' + private_property);
}
}.from(null); // .from() works too, but .from(null) is more revealing
// Create a new object using 'a' as the prototype
var b = function() {
var private_property = 'red';
this.public_property = 8;
}.from(a);
// See the results
a.public_method(); // Alerts '7 blue'
b.public_method(); // Alerts '8 blue' - Parent methods use parent private variables
a.public_method = function() { alert('rabbit'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'rabbit'
b.public_method = function() { alert('dog'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'dog' - Parent method is overwritten
La forma en que hizo la "de la" función es tal que cuando un objeto padre cambia sus métodos, si desea evitar el cambio en una instancia secundaria, puede especificar:
this.public_method = this.parent.public_method;
en la instancia hija.
Tenga en cuenta también que los objetos creados ex nihilo no heredan de Object (hasOwnProperty, etc.). Debe especificar esto explícitamente como .from (Object).
beneficios de este patrón:
- memoria no se pierde para cada nueva instancia
- Se adhiere a un patrón de herencia de prototipos cierto
- Usted tiene acceso al objeto principal de utilizar este. padre (este .__ proto__ es específico del navegador)
- Las variables privadas ahora existen
Hay un inconveniente importante de este método que puedo pensar: la sintaxis 'function()' puede confundir a las personas al pensar que se asigna una función a la variable en lugar de a un objeto.
Mi pregunta es, ¿hay otros inconvenientes que me falta? (No incluya inconvenientes del patrón prototípico, eso es subjetivo, sino solo de mi implementación).
Debe poner su idea como una publicación de blog. – Corv1nus
Los objetos creados con su función "from()" pasaron un 'null' de hecho heredan de Object. – Pointy
Vaya ... mi primera versión de esta publicación usó \ __ proto \ __ en su lugar y desde (null) no heredó de Object. Tengo que irme ahora, pero lo arreglaré más tarde ... – Nick