ES6 - déclarer une méthode de prototype sur une classe avec une instruction import
Je suis en utilisant ES6 classes. Je veux être capable de faire cela:
function Car(color) {
this.color = color;
};
Car.prototype.getColor = require('./getColor');
Où obtenir la couleur est une fonction exportée. c'est à dire je veux être en mesure d'importer une fonction à partir de l'extérieur par un fichier et l'ensemble est comme un prototype de la méthode sur l'ES6 Classe. C'est le genre de syntaxe, je suis en train de parler:
class Car {
constructor(color) {
this.color = color;
}
getColor() {} //I want to import this function from './getColor', as above
}
Est-ce faisable?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez toujours joindre une méthode sur un classe' prototype; après tout, les classes ne sont qu'sucre syntaxique sur un "objet fonctionnel", qui est l'ancienne manière d'utiliser une fonction pour construire des objets.
Puisque vous souhaitez utiliser ES6, je vais utiliser une ES6 importation.
Un minimum d'effort, en utilisant le prototype:
Comme vous pouvez le voir, vous utilisez toujours la propriété prototype de joindre une méthode, devrait vous choisissez d'.
D'appeler le module à l'intérieur d'une méthode de la classe de:
Alternativement, si vous ne voulez pas utiliser le prototype de la propriété, vous pouvez toujours avoir votre méthode de retour de la fonction à partir du module:
À l'aide d'un Getter
Vous pourriez aussi être un peu délicate, et l'utilisation d'un "getter" afin d'y parvenir d'une manière différente.
Vous pouvez ensuite l'utiliser simplement en appelant,
myInstanceOfCar.getColor()
Ou lors d'une sémantique de l'utilisation d'un getter:
Garder à l'esprit que les getters/setters ne peut pas avoir le même nom que les propriétés que vous définissez dans le constructeur. Vous allez vous retrouver dépasser la durée maximale de la pile des appels avec une récursion infinie lorsque vous essayez d'utiliser le setter pour définir la même propriété. Exemple:
set foo (value) { this.foo = value }
ES2016 des Propriétés de la Classe
Si vous êtes à l'aide de Babel à transpile (et sont à l'aide de propositions expérimentales), et que vous voulez utiliser certains ES2016, vous pouvez utiliser la syntaxe suivante (mais gardez à l'esprit que cela s'applique la méthode à l'objet directement, et ne le placez pas sur le prototype):
De fixation en option w/propriétés de la classe
Si vous utilisez le raccourci syntaxe pour définir une propriété, vous n'aurez pas à lier la méthode (le réglage est comme la modification d'une propriété de quoi "ce" désigne, essentiellement automatiquement la liaison), mais vous pouvez certainement, si vous choisissez de vous (si vous le souhaitez lier à autre chose):
this
.function
déclarations. Ce qui signifie que vous ne peut pas être importés à l'aide de la flèche fonctions.function
déclarations doivent être utilisés partout ailleurs (mais c'est juste ma préférence personnelle)Oui. Le
class
syntaxe est juste (très sophistiqué) sucre syntaxique pour les fonctions constructeur. DoncCar
sera toujours une fonction avec uneprototype
propriété et vous pouvez faire exactement la même chose:Cependant, qui rend la méthode énumérable, par opposition aux méthodes créé à partir de la classe de la syntaxe. Vous pouvez donc les utiliser
Object.defineProperty
à la place.require
ici pour des raisons de simplicité. Rien ne vous empêche d'utiliserimport
pour obtenir de la valeur. Comme pour la classe de syntaxe, non, ES6 ne fournit pas un moyen de le faire (à l'exception des solutions de contournement que délégué à la fonction, comme indiqué dans la réponse). Il y a un ES7 stade 0 proposition pour la classe de propriétés, où vous pouvez écrireclass Foo { getColor = require('./getColor'); }
, mais encore une fois, il n'y a rien de tel dans l'ES6.Si vous êtes intéressé, j'ai développé un petit module pour lier des fonctions avec un divers nombre de paramètres pour les méthodes de la classe: https://github.com/ngryman/to-method.