Конструкция класса ES6 - PullRequest
1 голос
/ 26 июня 2019

Я хотел бы спросить вас о построении классов в JavaScript, ES6.Это нормально, чтобы поместить имя класса в конструктор другого класса, который выходит из "материнского класса"?(немного сбит с толку ...)

  class Brick {
    constructor(x,y,graphic,width,height,type,live, speed){
      this.x = x
      this.y = y
      this.graphic = graphic
      this.width = width
      this.height = height
      this.type = type
      this.live = live
      this.speed = speed
  }
  print(){
      console.log(this.y)
      console.log(this.x)
      console.log(this.graphic)
      console.log(this.width)
      console.log(this.height)
      console.log(this.type)
      console.log(this.live)
    }
  init(){
    console.log('added to board')
  }
}

Теперь я хотел бы сделать класс, который расширяется из класса Brick, так:

  class BrickRed extends Brick {
    constructor(Brick){
      super(...arguments)
      this.graphic = "red.jpg"
      this.live = 15
    }
  }

Я не уверен, что все в порядке, потому что я не могу найти учебник, где он представлен, как указано выше.Именно эти две строки: constructor(Brick) и super(...arguments)

Из обучающих программ, которые я видел, лучший (и единственный) вариант - сделать так:

class BrickBlue extends Brick {
    constructor(x,y,graphic,width,height,type,live, speed){
      super(x,y,graphic,width,height,type,live, speed)
      this.graphic = "blue.jpg"
      this.live = 10
    }
  }

Но это выглядит ужасно,и я хочу улучшить это.

1 Ответ

4 голосов
/ 26 июня 2019

Это нормально, чтобы поместить имя класса в конструктор другого класса, который выходит из "материнского класса"?

Нет. Правильный путь - твой второй фрагмент. Однако, если BrickBlue жестко кодирует некоторые реквизиты, нет необходимости передавать их в конструктор:

class BrickBlue extends Brick {
    constructor(x,y,width,height,type,speed){
      super(x,y,"blue.jpg",width,height,type,10,speed)
    }
  }

Если вы ищете что-то вроде

class BrickBlue extends Brick {
    constructor(args-of-Brick)

такой вещи нет.

Но это выглядит ужасно, и я хочу улучшить его.

Да, длинные списки аргументов безобразны, и, поскольку JS еще не поддерживает именованные аргументы, вы мало что можете сделать. Однако вы можете рассмотреть возможность группировки связанных аргументов в отдельные объекты:

class Brick {
   constructor(position, graphic, size, type, behaviour) 

, где position - это что-то вроде {x:10, y:20} и т. Д.

Другой вариант - предоставить полный список аргументов для объекта, имитируя именованные аргументы:

class Brick {
    constructor({x, y, graphic, width, height, type, live, speed}) {

...

new Brick({
  x: 1,
  y: 2,
  graphic: ...
  ...
})

и в производном классе:

class BrickBlue extends Brick {
    constructor(args) {
        super({
            ...args,
            graphic: 'blue.jpg',
            live: 10
        })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...