Teniendo en cuenta los patrones de creación de objetos con propiedades particulares, una forma de hacerlo es:cómo tener el patrón de creación de objetos JavaScript con métodos reutilizables y propiedades privadas?
function MyStack(){
var list = [],
index = 0;
this.push = function(val){
return list[index++] = val;
};
this.pop = function(){// ...}
}
var stack1 = new MyStack(); stack1.push(5);
var stack2 = new MyStack(); stack2.push(11);
problema con esto: Cada instancia de la pila tiene su propia copia de los métodos 'empuje' y 'pop'.
Otra forma de implementar método constructor es:
function MyStack(){
this.list = [];
this.index = 0;
}
MyStack.prototype = {
insert: function(val){
return this.list[this.index++] = val;
},
pop:function(){//...}
}
problema aquí: Perdemos la privacidad de la lista y el índice.
¿Hay alguna manera de que podamos tener ambos métodos reutilizados entre las instancias y la privacidad de las propiedades?
Entiendo que podemos tener esto para los métodos que no operan en ningún estado del objeto, pero estoy hablando más acerca de los métodos que sí operan en el estado.
Puede dar a cada instancia una ID aleatoria y almacenar sus propiedades privadas en algún tipo de estructura de datos. Pero sugiero que simplemente olvide las propiedades privadas si usa funciones de constructor. JavaScript no está diseñado para eso y cualquier solución alternativa tiene alguna desventaja. –
@FelixKling así que digamos que tenemos un DS auxiliar, Like {id1: {list: [3,4], currentIndex: 2}, id2: {list: [2,1,4], currentIndex: 3}} .. .incluso en MyStack.prototype.insert = function (val) {currState = this.auxiliaryDS [this.id]; this.currState.list.push (val) .. De nuevo, no es realmente privado. – sbr
Puede definir el almacén de datos y la función de constructor dentro de una función y solo exponer la función de constructor.El almacén de datos sería entonces privado y no sería accesible desde el exterior. Sí, la ID sería accesible, pero incluso podría generar un nombre de propiedad aleatorio para esto si quisiera ofuscarla. Como dije, JS no está hecho para esto y todo lo que hagas será raro o complejo. La documentación adecuada es más valiosa IMO. Aquí puede encontrar bastantes preguntas relacionadas: http://stackoverflow.com/search?q=javascript+private+instance+variables+and+prototype+methods –