Очередной раз пытаюсь начать использовать классы из 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'
Просьба тестировать свои предложения на данном примере, перед тем как что-то советовать.
Буду очень благодарен за помощь!!