He estado tratando de ver si puedo construir mis objetos de JavaScript de la manera más intuitiva posible, asegurándome de que sea lo más 'correcto' posible. He estado corriendo un montón de escenarios diferentes a través de JSLint.com de Crockford y no he tenido mucha suerte. Parece que soluciono un error, luego aparece otro debido al cambio. A continuación es tan bueno como puedo obtener. Alguien tiene otra opinión sobre esto?¿Cuál es la mejor manera de crear un objeto JavaScript para que funcione Y pase JSLint?
Esta es una forma típica estructuro un objeto:
function gizmo(id) {
/* private variables */
var myId = id;
/* private methods */
var init = function() {
if (myId < 1) {
setId(1);
}
};
var setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function() {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
// creating an instance of gizmo
var myGizmo = gizmo(-2);
console.log(myGizmo.getId()); // outputs 1
myGizmo.setId(5);
console.log(myGizmo.getId()); // outputs 5
myGizmo.incrementId(2);
console.log(myGizmo.getId()); /// outputs 7
Esto parece funcionar bien. Sin embargo, cuando ejecuto esto a través de JSLint, me da un error que indica que mis dos funciones privadas son 'Implied Globals'.
Lo mejor que puedo llegar a es declarar mis funciones en la parte superior con las variables de este tipo:
function gizmo(id) {
/* private variables */
var myId = id,
init,
setId;
/* private methods */
init = function() {
if (myId < 1) {
setId(1);
}
};
setId = function (newId) {
myId = newId;
};
// run 'constructor'
init();
/* public methods */
return {
getId: function() {
return myId;
},
setId: function (newId) {
setId(newId);
},
incrementId: function (inc) {
setId(myId + inc);
}
};
}
Esto no es tanto una respuesta como un consejo. No te preocupes demasiado por jsLint. A menudo me parece demasiado estricto. Enfoque en la programación en su lugar. Dicho eso, dejaré que otros discutan las mejores prácticas. – TNi
De acuerdo. No lo estreso demasiado. Solo tengo mi manera de estructurar mi código en función de lo que he aprendido aquí y allá en los interwebs. He estado jugando con JSLint en los últimos días y estaba interesado en obtener la opinión de otras personas sobre todo. –
el problema es init y el orden de sus funciones. Mueve init justo antes de devolver el objeto que pasará. Además, no creo que necesites la función init. Tal vez como un fn autoejecutable y anónimo solo para separar cosas. – galambalazs