Как наследовать es6 класс обычным способом и как документировать их?

Очередной раз пытаюсь начать использовать классы из es2015 (es6), но всегда натыкаюсь на проблемы.
Помогите решить некоторые из них (если можно).

Условие:
Код должен работать нативно (без babel) в nodejs/chrome

Задачи:
1. Должна хорошо работать навигация по коду (а так же подсветка кода, автокомплит) в IDE (PhpStorm/WebStorm) - сейчас IDE не видит методов, lends не дает никакого эффекта, какой jsdoc нужно прописать?
2. Должна быть возможность наследовать классы es6 обычными классами (функциями с прототипным наследованием) - сейчас возникает ошибка "Class constructors cannot be invoked without 'new'", что вполне логично, ведь так сделаны классы в es6, но как это обойти для наследования - не понятно. Много гуглил, видел что в ангуляре что-то для этого сделали, но что именно - не понял.

Пример кода (4 файла):

models/Animal.js
'use strict';

/**
 * @namespace app.models
 */
app.models = app.models || {};

/**
 * @class app.models.Animal
 */
app.models.Animal = class /** @lends app.models.Animal.prototype */{

    static food() {
        return ['meat'];
    }

    constructor(name) {
        this._name = name;
    }

    get name() {
        return this._name;
    }

    say() {
        console.log(this.name + ', go eat: ' + this.constructor.food().join(', '));
    }

}


models/Cat.js
'use strict';

require('./Animal');

/**
 * @namespace app.models
 */
app.models = app.models || {};

/**
 * @class app.models.Dog
 * @extends app.models.Animal
 */
app.models.Cat = function(name, color) {
    // Short extend
    app.models.Animal.prototype.constructor.call(this, name)

    this._color = color;
}

// Short extend
var a = function() {};a.prototype = app.models.Animal.prototype;
app.models.Cat.prototype = new a();

app.models.Cat.prototype.getColor = function() {
    return this._color;
}


models/Dog.js
'use strict';

require('./Animal');

/**
 * @namespace app.models
 */
app.models = app.models || {};

/**
 * @class app.models.Dog
 * @extends app.models.Animal
 */
app.models.Dog = class extends app.models.Animal /** @lends app.models.Dog.prototype */{

    static food() {
        return super.food().concat('bone');
    }

    constructor(name, age) {
        super(name);
        this._age = age;
    }

    get age() {
        return this._age;
    }

}


index.js
'use strict';

global.app = {};

require('./models/Animal');
require('./models/Dog');
require('./models/Cat');

var dog = new app.models.Dog('Cooper', 3); // ok, class Dog found

console.log(dog._name); // ok, private name found

dog.say(); // IDE not found prototype methods
dog.age; // IDE not found prototype methods

app.models.Dog.food(); // IDE not found static methods

// Try extend without "class .. extends .."
var cat = new app.models.Cat('Barsik', 'orange'); // TypeError: Class constructors cannot be invoked without 'new'


Просьба тестировать свои предложения на данном примере, перед тем как что-то советовать.
Буду очень благодарен за помощь!!
  • Вопрос задан
  • 1481 просмотр
Пригласить эксперта
Ответы на вопрос 1
LestaD
@LestaD
Веб разработчик
class Animal {
  // ... some code
}

class Cat extends Animal {
  meow() {
    return this.voice.invoke();
  }
}

class Dog extends Animal {
  woof() {
    return this.voice.invoke(this.volume);
  }
}


Почитайте спецификацию классов, прежде чем задавать вопросы, пожалуйста.
Вы определитесь чего вы хотите в своём проекте, либо ES6 либо классический JS.
Пожалуйста, не смешивайте разные подходы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Lensoft.pro Санкт-Петербург
от 110 000 до 150 000 руб.
Complex Cloud Solutions Москва
от 90 000 до 120 000 руб.
Instapay Москва
от 2 000 до 3 000 usd.