JavaScript возвращает значение undefined при вызове члена-прототипа - PullRequest
0 голосов
/ 06 сентября 2018

Итак, я новичок в ООП в JavaScript и не могу понять, почему я получаю «undefined» в следующем коде, пожалуйста, помогите:

function Vehicle(energyType, energy) {
	this.energyType = energyType;
	this.energy = energy;
}

function Car(energyType, energy) {
	Vehicle.call(energyType, energy);

	this.doors = 4;
}

Car.prototype = Object.create(Vehicle.prototype);

Vehicle.prototype.run = function() {
	console.log(`This vehicle is running on ${this.energyType}.`);
}

const c = new Car('gas', 80);

c.run();

Когда вы запускаете код, он говорит: «Этот автомобиль работает на неопределённом уровне», хотя я сказал, что у автомобиля был газ energyType ...?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Когда вы .call, первый аргумент должен быть this, на который вы хотите, чтобы вызываемая функция ссылалась. Таким образом,

Vehicle.call(energyType, energy);

приводит к вызову Vehicle с параметром one , при этом значение this представляет собой то, что изначально было переменной energyType (приведено к объекту, поскольку this должен быть объектом не примитивный). Вы можете увидеть это, если вы console.log внутри Vehicle:

function Vehicle(energyType, energy) {
  console.log('this', this);
  console.log('energyType', energyType);
  console.log('energy', energy);
	this.energyType = energyType;
	this.energy = energy;
}

function Car(energyType, energy) {
	Vehicle.call(energyType, energy);

	this.doors = 4;
}

Car.prototype = Object.create(Vehicle.prototype);

Vehicle.prototype.run = function() {
	console.log(`This vehicle is running on ${this.energyType}.`);
}

const c = new Car('gas', 80);

c.run();

Изменить на:

Vehicle.call(this, energyType, energy);

function Vehicle(energyType, energy) {
	this.energyType = energyType;
	this.energy = energy;
}

function Car(energyType, energy) {
	Vehicle.call(this, energyType, energy);

	this.doors = 4;
}

Car.prototype = Object.create(Vehicle.prototype);

Vehicle.prototype.run = function() {
	console.log(`This vehicle is running on ${this.energyType}.`);
}

const c = new Car('gas', 80);

c.run();
0 голосов
/ 06 сентября 2018

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

function.call (thisArg, arg1, arg2, ...)

Pass this in Vehicle.call(this,energyType, energy);

function Vehicle(energyType, energy) {
	this.energyType = energyType;
	this.energy = energy;
}

function Car(energyType, energy) {
	Vehicle.call(this,energyType, energy);

	this.doors = 4;
}

Car.prototype = Object.create(Vehicle.prototype);

Vehicle.prototype.run = function() {
	console.log(`This vehicle is running on ${this.energyType}.`);
}

const c = new Car('gas', 80);

c.run();
0 голосов
/ 06 сентября 2018

Отсутствует this.

Vehicle.call(this, energyType, energy);
...