Слияние 2 классов - PullRequest
       12

Слияние 2 классов

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

Я хочу объединить 2 класса или добавить все методы из одного класса в другой.В будущем это будет больше классов, чем просто класс (ContainerClient).

Client и ContainerClient

Я пробовал это, но я думаю, что это можно сделать еще проще.

for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) {
  Client.prototype[a] = ContainerClient.prototype[a];
}

Принцип: ContainerClient зависит от Client

Data.js

class Data {
  constructor () {

  }
}

Client.js

class Client extends Data {
  me () {
    return {
      id: '1',
    };
  }
}

Контейнер.js

class Container extends Data {
  containers () {
    return [
      {
        clientId: '1',
        id: '2',
      },
      {
        clientId: '2',
        id: '3',
      },
    ];
  }
}

ContainerClient.js

class ContainerClient extends Data {
  containers () {
    return {
      clientId: '1',
      id: '2',
    };
  }
}

-> Client.js до export <- </h1> // --> HERE <-- for (var a of Object.getOwnPropertyNames(ContainerClient.prototype)) { Client.prototype[a] = ContainerClient.prototype[a]; } // -> [ 'constructor', 'me', 'containers' ]​​​​​ ? console.log(Object.getOwnPropertyNames(Client.prototype)); index.js const client = new Client(); const container = new Container(); // -> { clientId: '1', id: '2' }​​​​​ ? console.log(client.containers());

1 Ответ

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

Сначала короткий ответ: то, что вы делаете, - это (почти) лучшее, что вы можете сделать. Для небольшого улучшения вы можете заменить цикл for на Object.assign, и это сократит его на строку, но это все равно будет делать то же самое.

Теперь длинный ответ.

Я начну с того, что согласен со многими комментариями, которые пахнет этот дизайн (как в запахе кода). Скорее всего, не должно быть наследования, и каждый тип должен быть с использованием экземпляров других. Клиенты должны использовать объекты данных. Контейнеры должны быть массивом клиентских объектов. И пр.

С этим отказом от ответственности, вот более прямой ответ на ваш вопрос.

Имя того, что вы ищете, - множественное наследование / миксины. Python, просто для краткого примера, изначально поддерживает множественное наследование, поэтому в Python вы сможете написать:

class Client(Data, ContainerClient):
    ...

Но цепочка прототипов JavaScript поддерживает только одно наследование, поэтому вам придется согласиться на какой-то обходной путь. Один из таких обходных путей создает подклассы на лету с переменной base . Что-то вроде:

const ClientMixin = Sup => class extends Sup {
    // ...
};
const ContainerMixin = Sup => class extends Sup {
    // ...
};

Тогда вы можете определить ваши конкретные классы следующим образом:

class Container extends ContainerMixin(Data) {
    // ...
}

class ContainerClient extends ClientMixin(ContainerMixin(Data)) {
    // ...
}

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

...