Js наследуют от класса через прототипы - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно наследовать DataView объект, чтобы создать свой собственный type и добавить дополнительные методы и т. Д. Но я немного запутался, как сделать это правильно. Я пытался сделать так:

var CFDataView = function() {
    this.offset = 0;
};

CFDataView.prototype.__proto__ = DataView.prototype;

CFDataView.prototype.readU8 = function() {
   if (this.byteLength >= this.offset+1) {
     return this.getUint8(this.offset++);
   } else {
     return null;
   }
};

Но получил ошибку:

DataView.prototype.byteLength вызывается на несовместимом приемнике CFDataView

Из предложений я попытался сделать так:

var CFDataView = function CFDataView(buffer, byteOffset, byteLength) {
            DataView.call(this, buffer, byteOffset, byteLength);
            this.offset = 0;
        };

        CFDataView.prototype = Object.create(DataView.prototype);
        CFDataView.prototype.constructor = CFDataView;

Но получите ошибку:

TypeError: Конструктор DataView требует 'new'

1 Ответ

0 голосов
/ 08 мая 2018

Вам нужно использовать ES6 class для расширения собственных классов, таких как DataView. Как говорится в сообщениях об ошибках, вы можете использовать методы только для реальных представлений данных («совместимых получателей»), а для их создания вам нужно использовать конструктор DataViewnew - или с super или Reflect.construct ). Так

class CFDataView {
  constructor(...args) {
    super(...args)
    this.offset = 0;
  }
  readU8() {
    if (this.byteLength >= this.offset+1) {
      return this.getUint8(this.offset++);
    } else {
      return null;
    }
  }
}
...