En ES6, ambos son legales:
var chopper = {
owner: 'Zed',
getOwner: function() { return this.owner; }
};
y, como taquigrafía:
var chopper = {
owner: 'Zed',
getOwner() { return this.owner; }
}
¿Es posible utilizar también las nuevas funciones de flecha? Al intentar algo como
var chopper = {
owner: 'John',
getOwner: () => { return this.owner; }
};
o
var chopper = {
owner: 'John',
getOwner: () => (this.owner)
};
Recibo un mensaje de error que sugiere que el método no tiene acceso a this
. ¿Es esto solo un problema de sintaxis, o no puede usar métodos fat-pipe dentro de los objetos ES6?
this
diferente. Está definido por el entorno léxico en el que se creó la función, lo que significa que elthis
valor donde crea lachopper
variable será elthis
valor de la función. En otras palabras, no hará referencia alchopper
objeto.this
valor creando primero elchopper
objeto y luego haciendo la asignación en una función quethis
apunte a ese objeto. Esto se puede lograr de forma bastante limpia con una función de constructor.console.log()
el resultado de la llamada al método. Funciona.Respuestas:
Las funciones de flecha no están diseñadas para usarse en todas las situaciones simplemente como una versión más corta de funciones pasadas de moda. No pretenden reemplazar la sintaxis de la función utilizando la
function
palabra clave. El caso de uso más común para las funciones de flecha es tan corto como "lambdas" que no redefinenthis
, a menudo se utilizan cuando se pasa una función como una devolución de llamada a alguna función.Las funciones de flecha no se pueden usar para escribir métodos de objeto porque, como ha encontrado, dado que las funciones de flecha se cierran sobre el
this
contexto que las encierra léxicamente, elthis
interior de la flecha es el que estaba vigente donde definió el objeto. Que es decir:// Whatever `this` is here... var chopper = { owner: 'Zed', getOwner: () => { return this.owner; // ...is what `this` is here. } };
En su caso, si desea escribir un método en un objeto, simplemente debe usar la
function
sintaxis tradicional o la sintaxis del método introducida en ES6:var chopper = { owner: 'Zed', getOwner: function() { return this.owner; } }; // or var chopper = { owner: 'Zed', getOwner() { return this.owner; } };
(Hay pequeñas diferencias entre ellos, pero solo son importantes si usa
super
ingetOwner
, que no es, o si copiagetOwner
a otro objeto).Hubo cierto debate en la lista de correo de es6 sobre un giro en las funciones de flecha que tienen una sintaxis similar pero con la suya propia
this
. Sin embargo, esta propuesta fue mal recibida porque es un simple azúcar sintáctico, lo que permite a las personas ahorrar escribiendo algunos caracteres y no proporciona una nueva funcionalidad sobre la sintaxis de funciones existente. Consulte el tema Funciones de flechas independientes .fuente
En esta línea
getOwner: => (this.owner)
debería estar:var chopper = { owner: 'John', getOwner: () => this.owner }; //here `this` refers to `window` object.
Tendrías que declarar
this
en una función:var chopper = { owner: 'John', getOwner() { return this.owner } };
O:
var chopperFn = function(){ this.setOwner = (name) => this.owner = name; Object.assign(this,{ owner: 'Jhon', getOwner: () => this.owner, }) } var chopper = new chopperFn(); console.log(chopper.getOwner()); chopper.setOwner('Spiderman'); console.log(chopper.getOwner());
fuente
"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
this
dentro de una función.this
no necesariamente se refiere awindow
. Se refiere a cualquier valor actual de que sethis
encuentre en el entorno circundante, que puede estar o nowindow
. Quizás eso es lo que quisiste decir. Solo quiero asegurarme de que entiende que no es un valor predeterminado.this
ahora se refiere a clasevar chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
.Un consejo rápido que sigo para usar las funciones de flecha.
object.method()
sintaxis. (Esas son funciones que recibirán unthis
valor significativo de su interlocutor).fuente
Esta función de flecha interior no refleja el contexto del objeto. En su lugar, proporciona el contexto donde se llama al método del objeto.
Compruebe esto, esto le da una idea de cuándo usar la flecha y cuándo no. https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/
fuente
Si tiene que utilizar la función de flecha, puede cambiar
this
achopper
,var chopper = { owner: "John", getOwner: () => chopper.owner };
Aunque esta no es la mejor práctica, cuando cambia el nombre del objeto, debe cambiar esta función de flecha.
fuente
Otro consejo, en modo estricto,
this
todavía se refiere a Window en lugar de undefined.(() => { "use strict"; console.log(this); // window })(); (function () { "use strict"; console.log(this); // undefined })();
fuente