Как вызвать метод абстрактного класса в JavaScript - PullRequest
0 голосов
/ 29 апреля 2018

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

Я могу создать экземпляр этого класса, создав Proxy и перехватив construct, и, похоже, он работает. Свойства нового экземпляра установлены правильно, но мне трудно вызывать его методы.

function AbstractNumbers(...args) {
  if (new.target === AbstractNumbers) {
    throw new Error('Cannot instantiate abstract class');
  }
  this.numbers = args;
}
AbstractNumbers.prototype.showNumbers = function() { console.log(this.numbers); }

const AbstractNumbersProxy = new Proxy(AbstractNumbers, {
  construct(target, args) {
    // change 3rd argument to bypass new.target test
    return Reflect.construct(target, args, function() {});
  }
});

const n = new AbstractNumbersProxy(1, 2, 3);

// set prototype back to AbstractNumbers
Object.setPrototypeOf(n, AbstractNumbers);

// n.__proto__ shows the correct prototype
console.log(n.__proto__);

// property n.numbers is set correctly
console.log(n.numbers);

// calling its prototype method fail
n.showNumbers();

Как правильно создать экземпляр этого абстрактного класса, чтобы я мог вызывать его методы?

1 Ответ

0 голосов
/ 29 апреля 2018

В

// set prototype back to AbstractNumbers
Object.setPrototypeOf(n, AbstractNumbers);

вы вернули прототип обратно функции конструктора вместо его свойства prototype. Попробуйте

Object.setPrototypeOf(n, AbstractNumbers.prototype);

вместо

function AbstractNumbers(...args) {
  if (new.target === AbstractNumbers) {
    throw new Error('Cannot instantiate abstract class');
  }
  this.numbers = args;
}
AbstractNumbers.prototype.showNumbers = function() { console.log(this.numbers); }

const AbstractNumbersProxy = new Proxy(AbstractNumbers, {
  construct(target, args) {
    // change 3rd argument to bypass new.target test
    return Reflect.construct(target, args, function() {});
  }
});

const n = new AbstractNumbersProxy(1, 2, 3);

// set prototype back to AbstractNumbers
Object.setPrototypeOf(n, AbstractNumbers.prototype);

// n.__proto__ shows the correct prototype
console.log(n.__proto__);

// property n.numbers is set correctly
console.log(n.numbers);

// calling its prototype method fail
n.showNumbers();

Пожалуйста, не просите меня расследовать, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...