I am using ES6 classes. I want to be able to do this:
function Car(color) {
this.color = color;
};
Car.prototype.getColor = require('./getColor');
Where get color is an exported function. i.e. I want to be able to import a function from an outside file and set is as a prototype method on the ES6 Class. This is the kind of syntax I am talking about:
class Car {
constructor(color) {
this.color = color;
}
getColor() {} // I want to import this function from './getColor', as above
}
Is this doable?
You can still attach a method on a class' prototype; after-all, classes are just syntactic sugar over a "functional object", which is the old way of using a function to construct objects.
Since you want to use ES6, I'll use an ES6 import.
Minimal effort, using the prototype:
As you can see, you still use the prototype property to attach a method, should you choose to.
Calling the module within a class' method:
Alternatively, if you don't want to use the prototype property, you can always have your method return the function from the module:
Using a Getter
You could also be a bit tricky and use a "getter" to achieve this in a different manner.
You could then use it simply by calling,
myInstanceOfCar.getColor()
Or in a more semantic usage of a getter:
Keep in mind that getters/setters cannot have the same name as properties that you set in the constructor. You will end up exceeding the maximum call-stack with infinite recursion when you try to use the setter to set that same property. Example:
set foo (value) { this.foo = value }
ES2016 Class Properties
If you're using Babel to transpile (and are using experimental proposals), and want to use some ES2016, you can use the following syntax (but keep in mind that this applies the method to the object directly, and does not set it on the prototype):
Optional binding w/ class properties
If you use the shorthand syntax for setting a property, you won't have to bind the method (setting is as a property changes what "this" refers to, essentially automatically binding it), but you certainly can, should you choose to (like if you'd like to bind something else):
Yes. The
class
syntax is just (very sophisticated) syntactic sugar for constructor functions. SoCar
will still be a function with aprototype
property and you can do exactly the same:However, that makes the method enumerable, as opposed to the methods created from the class syntax. So you might want to use
Object.defineProperty
instead.If you are interested, I've developed a little module to bind functions with various number of parameters to class methods: https://github.com/ngryman/to-method.