2015-07-15 6 views
0

Я пишу функцию, которая принимает классы и возвращает класс с одним классом, который может быть расширен, однако я недавно переключился на транспортер babel и понял, что я не должен называть конструкторы классов без новых,Путь вокруг вызова класса es6 с новым?

есть ли способ вокруг этого, который будет работать и в реальном es6?

вот мой многофункциональный

Object.getOwnPropertySymbols; 

module.exports = function multiple(_classes){ 
    class MultipleClasses{} 

    for (const {obj:_class} of iterateObject(_classes)){ 
     const prototypeChain = []; 
     let prototype = _class.prototype; 
     do{ 
      prototypeChain.push(prototype); 
     } 
     while((prototype = prototype.__proto__) !== null) 
     prototypeChain.reverse(); 
     for (const prototype of prototypeChain){ 
      assignNonEnumerable(MultipleClasses.prototype, prototype); 
     } 
    } 

    for (const {key, obj:_class} of iterateObject(_classes)){ 
     MultipleClasses.prototype[key] = _class.prototype.constructor; 
    } 

    return MultipleClasses; 
} 

function* iterateObject(obj){ 
    const keys = Object.getOwnPropertyNames(obj); 
    for (const key of keys){ 
     yield {key, obj:obj[key]}; 
    } 
} 

function assignNonEnumerable(target, source){ 
    const keys = Object.getOwnPropertyNames(source); 
    for (const key of keys){ 
     Object.defineProperty(target, key, { 
      enumerable:false, 
      writable:true, 
      configurable:true, 
      value:source[key] 
     }); 
    } 
    const symbols = getOwnPropertySymbols(source); 
    for (const symbol of symbols){ 
     Object.defineProperty(target, symbol, { 
      enumerable:false, 
      writable:true, 
      configurable:true, 
      value:source[symbol] 
     }); 
    } 
} 

и расширяющие классы я использую

class Player extends multiple({Physical, Circle}) { 
    constructor(_x, _y, input){ 
     super(); 
     super.Physical(_x, _y) 
     super.Circle(_x, _y, playerRadius); 
... 

есть способ, чтобы получить супер назвать несколько функций или что-то?

+0

[расширенный объект литералов] (https://babeljs.io/docs/learn-es2015/#enhanced-object-literals)? (вы можете установить прототип таким образом) – royhowie

+2

В каком классе вы узнали, что классы могут возвращать классы классов, содержащие класс? (Другими словами, ваш вопрос не ясен и не хватает кода) – Amit

+1

Если вы смешиваете кучу вещей в одну вещь, вы должны смешивать свойства с существующим классом или расширять существующий класс. Смешение их вместе приведет к разрыву наследования. Правильное наследование от подклассов - это причина, по которой эти классы работают. – loganfsmyth

ответ

1

На 100% требуется, чтобы конструкторы классов в ES6 вызывались либо через new Constructor(), либо через super(). Нет никакого способа обойти это, потому что это поведение критично для двигателей JavaScript, чтобы иметь возможность создавать подходящий тип объекта.

В вашем случае, скажем, круг был

class Circle extends Array {} 

ваш код будет перерыв, так как объект, создаваемый

new Player() 

не будет массив объектов. Это относится к любым родным подклассам и является причиной того, что требуется new.

Если вы хотите, чтобы что-то представляло собой комбинацию из множества наборов функций, вам нужно будет вручную скомпоновать эти функции из стандартных объектов.

+1

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

0

Хотя новый может быть «опасным», если вы создаете свои классы с определенными защитами, вы все равно можете использовать классы. Да, это немного причудливо, а «Хорошая часть» - они поворачиваются на нос, но я чувствую, что занятия по-прежнему выигрывают в целом.

class Player { 
    constructor(/*args...*/) { 
    if(!(this instanceof Player)) { 
     return new Player(/*args...*/); 
    } 
    } 
} 

var player1 = Player("Spencer"); 
var player2 = new Player("Other guy") 
+0

Правда, недостатком этого является то, что вы рискуете утечкой ресурсов, неожиданно создавая две копии объекта, а затем отбрасывая ссылку на одну, особенно после того, как вы начнете создавать иерархии классов , – loganfsmyth

+0

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

+0

Это не работает , он всегда будет вызывать 'TypeError' в ES6. – Bergi