¿Cuál es la diferencia entre los siguientes bits de código:
function Foo(context) { let mode; function setMode(m) { mode = m; } function doStuff() { if(mode === 'param') { // ... do stuff with context } else { // ... do different stuff with context } } this.setMode = setMode; this.doStuff = doStuff; }contra
function Bar(context) { let mode; function setMode(m) { mode = m; } function doStuff() { if(mode === 'param') { // ... do stuff with context } else { // ... do different stuff with context } } return { setMode, doStuff, } } En Foo, uso this para 'aumentar' la new instancia de la función Foo:
const f = new Foo(); f.setMode('param'); f.doStuff(stuff); En Bar, return un objeto 'nuevo' con métodos cada vez que se llama a la función Bar:
const b = Bar(); b.setMode('parampam'); f.doStuff(stuff); ¿Hay algún beneficio (¿rendimiento? ¿uso de memoria?) de usar una forma u otra? return vs this ?
Estoy familiarizado con el alcance léxico 'este' y cómo funciona el cierre, pero me gustaría saber si la elección anterior es puramente sintáctica o tiene implicaciones de rendimiento.
Las implicaciones de rendimiento serán triviales: no se preocupe por eso a menos que este código se llame mucho y, en ese caso, es mejor comparar ambos enfoques para ver cómo están afectando el rendimiento en su caso específico.
Hay algunas diferencias de comportamiento involucradas. Por ejemplo, new Foo().constructor apunta a la función Foo , mientras que el objeto devuelto al llamar a Foo() o Bar() sin la new palabra clave no lo hace. Además, puede usar el operador instanceof para verificar si un objeto es una instancia de Foo (es decir, si el objeto se construyó llamando a new Foo() ).
Así que quiere pensar en cómo quiere que los usuarios piensen en su función.
Si desea que los usuarios sientan que están creando una instancia de un tipo de clase específico e interactuando con esa clase, use el primer patrón. El hecho de que tenga funciones en ese objeto que actúen como métodos de instancia me hace pensar que eso es lo que busca en este caso.
Si desea que los usuarios sientan que la función a la que llaman obtendrá un objeto y lo devolverá, use el segundo patrón. En ese caso, probablemente cambiaría el nombre de Bar a algo como getBar() o createBar() .