Какие свойства хранятся в каком объекте при прототипировании Javascript? - PullRequest
0 голосов
/ 11 марта 2020
class Message {
  constructor(text) {
    this.text = text;
  }
  toString() {
    return this.text;
  }
}

class ErrorMessage extends Message {
  constructor(text, code) {
    super(text);
    this.code = code;
  }
}

const message = new ErrorMessage('Test', 404);

Что такое прототип, скажем, если мы вызываем: ErrorMessage.prototype или Message.prototype? Какие свойства хранятся в каких объектах (text, toString и code)?

1 Ответ

2 голосов
/ 11 марта 2020

Оба конструктора при запуске имеют this, который является новым создаваемым экземпляром. Таким образом, строки

this.text = text;

и

this.code = code;

оба помещают свойство непосредственно в экземпляр.

Вы можете увидеть это, если отметите hasOwnProperty:

class Message {
  constructor(text) {
    this.text = text;
  }
  toString() {
    return this.text;
  }
}

class ErrorMessage extends Message {
  constructor(text, code) {
    super(text);
    this.code = code;
  }
}

const m = new ErrorMessage();
console.log(
  m.hasOwnProperty('text'),
  m.hasOwnProperty('code')
);

toString - это обычный метод для Message.prototype. Это означает, что экземпляр (при условии, что вы создаете ErrorMessage) наследует это свойство через ErrorMessage.prototype, поскольку он наследует от Message.prototype. Внутренняя цепочка прототипов:

instance <- ErrorMessage.prototype <- Message.prototype <- Object.prototype
...