Reputation: 640
Say I have the following object definition:
var car = function (engine) {
this.engine = engine;
this.calculateSpeed = function () {
return engine.power * 20;
};
};
the engine
object in the calculateSpeed()
function refers to the engine object passed in via the constructor and not the car's public engine member(which is the one I want).
If I wanted to change the engine of the car after creating the car object I want the calcuateSpeed()
function to reference the new engine.
The Inner function cannot access outer functions variable question is similar to mine. But does not quite cover my use case as the OP is using a local variable and has no constructor.
If you could also explain why this won't work, that would also help a lot:
var car = function (engineInit) {
this.engine = engineInit;
this.calculateSpeed = function () {
return engine.power * 20;
};
};
I know for this simple example I could use this.calculateSpeed = engine.power * 20;
but for my real use case, I need a function.
Upvotes: 0
Views: 59
Reputation: 1631
You can actually use this.engine.power
.
// Define Car constructor
const Car = function (engineInit) {
this.engine = engineInit;
this.calculateSpeed = function () {
return this.engine.power * 20;
};
};
// Create new car instance
const carInstance = new Car({ power: 100 });
// Log the result of calculateSpeed function
console.log(carInstance.calculateSpeed());
Upvotes: 2
Reputation: 370689
If you want the internal engine
to be separate from the engine
property visible on the outside of the instantiated Car
, you might consider simply having another locally scoped variable, separate from the initial engine
parameter, and reassigning it as necessary:
var Car = function(initialEngine) {
this.engine = initialEngine;
let engine = initialEngine;
this.calculateSpeed = function() {
return engine.power * 20;
};
this.changeEngine = function(newEngine) {
engine = newEngine;
}
};
var car = new Car({ power: 20 });
console.log(car.calculateSpeed());
car.changeEngine({ power: 40 });
console.log(car.calculateSpeed());
Upvotes: 1
Reputation: 18690
This question is a duplicate of many other questions on stackoverflow, but here is something to get you started anyway.
By capturing this in another variable:
var car = function(engineInit) {
this.engine = engineInit;
var self = this;
this.calculateSpeed = function () {
return self.engine.power * 20;
};
};
By using bind:
var car = function(engineInit) {
this.engine = engineInit;
this.calculateSpeed = function () {
return this.engine.power * 20;
}.bind(this);
};
By using a function's prototype:
function Car(engine) {
this.engine = engine;
}
Car.prototype.calculateSpeed = function() {
return this.engine.power * 20;
};
var engine = new Engine();
var car = new Car(engine);
var speed = car.calculateSpeed();
Upvotes: 0