Наследование классов JavaScript - метод fill не работает - PullRequest
1 голос
/ 24 октября 2019

Проблема

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

class RequestFile {
    constructor (args = {}) {
        // this.to = args.to ? args.to : []
        // this.files = args.files ? args.files : []
        // this.body = args.body ? args.body : ''
    }
    fill ({to=[],files=[], subject='', body='', }) {
      this.to = to
      this.files = files
      this.subject = subject
      this.body = body
    }
}

class Mail extends RequestFile {
    constructor (args = {}) {
      super(args)
      this.fill(args)
    }
    fill ({cc='', draft=false, preview=true}) {
      this.cc = cc
      this.draft = draft
      this.preview = preview
    }
    to() {
      console.log(this.to)
    }
}
let mail = new Mail({
  to: [ 'name@gmail.com' ],
  files: [ 1111 ],
  subject: 'Sent from Node',
  body: 'test body  -- sent from node',
  cc: [ 'anotherone@gmail.com', 'another@gmail.com' ],
  draft: true,
  preview: true
})

console.log(mail)

Приведенное выше выводит следующее:

Mail {
cc:(2) [...],
draft: true ,
preview: true
}

Раскомментированиекод в классе RequestFile дает другой результат:

class RequestFile {
    constructor (args = {}) {
        this.to = args.to ? args.to : []
        this.files = args.files ? args.files : []
        this.body = args.body ? args.body : ''
    }
    fill ({to=[],files=[], subject='', body='', }) {
      this.to = to
      this.files = files
      this.subject = subject
      this.body = body
    }
}

Mail {
to:(1) [...],
files:(1) [...],
body: "test body -- sent from node" ,
cc:(2) [...],
draft: true ,
preview: true
}

В идеале, я хотел бы положиться на метод fill для заполнения переменных класса, я просто запутался, почему он работает в подклассе (Mail) но не работает в родительском классе (RequestFile)

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Из метода fill() в дочернем классе вызовите унаследованный метод fill() базового класса. Используйте специальную переменную arguments для передачи исходного параметра до применения деконструкции объекта.

Затем можно даже переместить вызов на fill() в конструктор базового класса и ненеобходимо вызвать метод fill из конструктора дочернего класса.

class RequestFile {
    constructor (args = {}) {
        this.fill(args);
    }

    fill ({to=[],files=[], subject='', body='', }) {
      this.to = to
      this.files = files
      this.subject = subject
      this.body = body
    }
}

class Mail extends RequestFile {
    constructor (args = {}) {
      super(args)
    }

    fill ({cc='', draft=false, preview=true}) {
      // pass on original parameter to base class fill method
      super.fill(arguments[0])
      this.cc = cc
      this.draft = draft
      this.preview = preview
    }
    to() {
      console.log(this.to)
    }
}

Альтернативное решение - использовать разные имена для методов заполнения в базовых и дочерних классах:

class RequestFile {
    constructor (args = {}) {
        this.fillRequestFile(args);
    }

    fillRequestFile ({to=[],files=[], subject='', body='', }) {
      this.to = to
      this.files = files
      this.subject = subject
      this.body = body
    }
}

class Mail extends RequestFile {
    constructor (args = {}) {
      super(args)
      this.fillMail(args);
    }

    fillMail ({cc='', draft=false, preview=true}) {
      this.cc = cc
      this.draft = draft
      this.preview = preview
    }
    to() {
      console.log(this.to)
    }
}
0 голосов
/ 24 октября 2019
class Mail extends RequestFile {
    constructor (args = {}) {
      super()
      super.fill(args)
      this.fill(args)
    }
    fill ({cc='', draft=false, preview=true}) {
      this.cc = cc
      this.draft = draft
      this.preview = preview
    }
    to() {
      console.log(this.to)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...