¿Cuál es el mejor patrón de diseño para el logro de los siguientes (que no funciona)?Javascript: Llamar a métodos de objeto dentro de ese objeto
var obj = (function() {
// code defining private variables and methods
var _obj = {
property: value,
method1: function() {
// do stuff
},
method2: function() {
// use property
var prop = _obj.property; // obviously doesn't work
// call method1
obj.method1(); // "obj" not finished being defined yet!
}
};
// obviously now I could do...
var prop = _obj.property;
return _obj;
})();
// and I could now do...
obj.method1();
Una variación que creo que debería funcionar es
var obj = (function() {
var property = value,
method1 = function() {
// do stuff
},
method2 = function() {
// use property
var prop = property;
// call method1
method1();
},
_obj = {
property: property,
method1: method1,
method2: method2
};
return _obj;
})();
Del mismo modo, ¿cómo funciona para objetos destinados a ser creado con el operador new
? Dentro de la propia función de constructor puedes escribir . Pero, ¿y si quieres mantener pequeño al constructor, solo definir aquellas cosas que probablemente se personalizarán en la creación, y luego definir el resto en el prototipo? (Este parece ser el patrón común.) ¿Pueden las propiedades/métodos dentro del prototipo interactuar de alguna manera?
var MyObj = function(name) {
this.name = name;
};
var obj = new MyObj('Bob');
MyObj.prototype = {
called_often: function() {
// lots more code than just the following
return document.getElementById('someID').value;
},
global_default: 'value', // can be changed, so need to pull value when run
does_stuff: function(value) {
var str = global_default + value, // can't access global_default on its own
input = MyObj.called_often(), // doesn't work; MyObj.prototype.called_often() DOES
name = this.name; // 'this' used in the prototype doesn't work
// even within a created object
return name + input + str;
}
};
Estoy seguro de que hay mejores formas de lograr mi resultado siempre que me encuentre con este problema. Este código no es específico de la situación y simplemente ilustra el problema general. Entonces no podrás darme una alternativa para esas situaciones específicas con las que me encuentro. Pero tal vez puedas ayudar mi pensamiento general.
había pensado que 'esto' sólo apunta al objeto si se ha creado con la nueva + constructor, o si se utiliza la llamada/aplican. Pero tienes razón, ¡funciona! Aparentemente he estado confundido todo este tiempo. Además, pensé que había intentado eso. Pero aparentemente no. –
JavaScript es increíblemente simple y sorprendentemente complicado al mismo tiempo :-) Resulta que 'this' está vinculado en el momento en que se llama a una función, y eso es todo; sin embargo, esa regla simple conduce a todo tipo de detalles interesantes. – Pointy
Hola, puntiagudo. Tengo el mismo tipo de problema. Estoy usando 'roundslider.js' y estoy llamando a una función donde has escrito hacer cosas. Pero es un error para mí. '$ (" # slider "). RoundSlider ({ cambio: función (evento) { traceEvent() },' }); – locateganesh