JS состав / наследование прототипа - PullRequest
0 голосов
/ 31 мая 2018

Я хочу иметь возможность расширять любой объект, указанный в функции .extend(obj).Пока что он работает, за исключением случаев, когда в него передается литерал объекта.

пример:

class myClass {
  static extend(obj) {
    Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
    myClass.call(obj);
  }

  sayHello() {
    return 'hello!'
  }
}

Это прекрасно работает, когда функция расширения вызывается из конструктора следующим образом:

function foo() {
  myClass.extend(this);
}
const bar = new foo();
bar.sayHello();

Однако, когда я передаю объектный литерал, который уже создан, методы из myClass.prototype недоступны.

const foo = {};
myClass.extend(foo);
foo.sayHello(); // this is not available.

Есть ли способ проверить последний случай иназначить прототип самому объекту вместо его прототипа, чтобы последний сценарий также работал?

static extend() {
  if (/* obj is an object literal */) {
    Object.assign(obj, myClass.prototype);
  } else {
    // first example
}

1 Ответ

0 голосов
/ 04 июня 2018

Это прекрасно работает, когда функция расширения вызывается из конструктора, например так:

Она не должна работать нормально, и когда я ее запустил, я получил ошибку Class constructor myClass cannot be invoked without 'new',Эта ошибка из-за утверждения myClass.call(obj);.Только если я изменю класс на функцию конструктора ES5, он будет работать.

Однако, когда я передаю объектный литерал, который уже создан, методы из myClass.prototype недоступны.

Они были для меня.

function myClass() {}

myClass.extend = function(obj) {
  Object.assign(Object.getPrototypeOf(obj), myClass.prototype);
  myClass.call(obj);
}

myClass.prototype.sayHello = function() {
  return 'hello!'
}

const foo = {};
myClass.extend(foo);
foo.sayHello(); // "hello!"
...