метод, объявленный вне замедления класса, не может быть унаследован дочерним классом в javascript - PullRequest
0 голосов
/ 20 марта 2020
// declared class vehicle
function Vehicle(make,model,year){
  this.make=make
  this.model=model
  this.year=year

}
// 2 - Add a function to the Vehicle prototype called start which returns the string //"VROOM!"
 Vehicle.prototype.start=function(){
  return "VROOM!"
}

// declared child class car
function Car(make,model,year){
  Vehicle.apply(this,arguments)
  this.numWheels=4

}
// assigning the constructor
Car.prototype.constructor=Object.create(Vehicle.constructor)
// changing the pointing of constructor back to car
Car.prototype.constructor=Car;
var sedan=new Car("Tractor", "John Deere", 1999)
console.log(sedan.start()) 
//sedan.start() gives error but if i declare it inside vehicle class does not 

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Эти строки кода не имеют смысла:

// assigning the constructor
Car.prototype.constructor=Object.create(Vehicle.constructor)
// changing the pointing of constructor back to car
Car.prototype.constructor=Car;

Они не имеют смысла, потому что выполнение присваивания этому конструктору и последующее немедленное другое присвоение означает, что Первое назначение ни на что не повлияет.

Я думаю , что вам нужно вместо этого:

// assigning the constructor
Car.prototype=Object.create(Vehicle.prototype)
// changing the pointing of constructor back to car
Car.prototype.constructor=Car;

Теперь у вас будет ссылка на прототип Car к Vehicle прототипу, так что экземпляры Car будут иметь оба в своих цепочках прототипов.

В этом современном мире 2020 года вы можете сделать все это с помощью объявлений класса.

0 голосов
/ 20 марта 2020

Чтобы получить Car() для наследования методов, определенных в прототипе Vehicle(), вы можете просто использовать:

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

Здесь Object.create() метод используется для создания новый объект и установите для него значение Car.prototype. Новый объект имеет Vehicle.prototype в качестве прототипа и поэтому наследует все методы, доступные в Vehicle.prototype. Таким образом, нет необходимости использовать приведенные ниже логи c:

// assigning the constructor
Car.prototype.constructor=Object.create(Vehicle.constructor)

DEMO:

// declared class vehicle
function Vehicle(make, model, year) {
  this.make = make
  this.model = model
  this.year = year
}

// 2 - Add a function to the Vehicle prototype called start which returns the string //"VROOM!"
Vehicle.prototype.start = function() {
  return "VROOM!"
}

// declared child class car
function Car(make, model, year) {
  Vehicle.apply(this, arguments)
  this.numWheels = 4
}
Car.prototype = Object.create(Vehicle.prototype);
Car.prototype.constructor = Car;
var sedan = new Car("Tractor", "John Deere", 1999)
console.log(sedan.start())

Лучший подход с использованием Classes:

ECMAScript 2015 вводит синтаксис класса для JavaScript как способ написания повторно используемых классов с использованием более простого и понятного синтаксиса, который больше похож на классы в C ++ или Java. Здесь мы преобразуем пример Vehicle и Car из наследования прототипа в классы, чтобы показать вам, как это делается.

DEMO:

class Vehicle {
  constructor(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;
  }
  start() {
    return "VROOM!"
  };
}

class Car extends Vehicle {
  constructor(make, model, year) {
    super(); // Now 'this' is initialized by calling the parent constructor.
  }
  bonet() {
    return "VROOM2!"
  };
}

var sedan = new Car("Tractor", "John Deere", 1999)
console.log(sedan.start())
console.log(sedan.bonet())
...