#javascript #inheritance #es6-modules
#javascript #наследование #es6-модули
Вопрос:
Я настраиваю модули JS для проекта, где я использую прототипы для программирования OO (поскольку я не уверен, что фреймворк поддерживает синтаксис класса ES6). Один модуль содержит «классы» для определенной цели, а другой модуль импортирует и использует их.
Я просмотрел всю документацию, которую смог найти, о том, как правильно настроить наследование с помощью прототипов JS и как экспортировать и импортировать модули. Приведенный ниже пример кода иллюстрирует, к чему я стремлюсь.
MyModule.js:
function A(x, y) {
this.x = x;
this.y = y;
}
A.prototype.foo = function(bla) {
// ...
}
function B(x, y, z) {
A.call(this, x, y);
this.z = z;
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
export { B };
MainModule.js:
import * as MyModule from "./MyModule.js"
var b;
function bar() {
b = new MyModule.B(1, 2, 3);
b.foo(4); // <-- error happens here
}
Когда я пытаюсь запустить bar
, b.foo
не определено. Переменные-члены (например b.z
, ) работают нормально, но функции, добавленные в прототипы, этого не делают.
У кого-нибудь есть идеи? Заранее спасибо!
Комментарии:
1. для меня работает нормально. Однако одно замечание: вы экспортируете / импортируете, используя синтаксис ES6, поэтому вам нужно будет изменить его на синтаксис, предшествующий ES6, или скомпилировать код с чем-то вроде
Babel
. (… и если вы компилируете, вы также можете использовать более приятный синтаксис класса ES6)2. @brian-lives-outdoors какой самый простой способ попробовать и протестировать этот код? Я пробовал онлайн-приложения для тестирования JS, но они могут выполнять только один файл
3. @brian-lives-outdoors переключение на синтаксис класса ES6 сделало свое дело. Спасибо!
Ответ №1:
похоже, вы используете синтаксис es6, поэтому вы могли бы просто сделать что-то вроде
export function B(x, y, z) {
A.call(this, x, y);
this.z = z;
}
затем импортируйте
import { B as MyModule } from "./MyModule.js"
или любое другое имя, которое вы хотите ему присвоить
Комментарии:
1. Попробовал, все еще сталкиваясь с той же проблемой.
2. вы используете что-то вроде Babel для компиляции? если нет, то синтаксис импорта es6 не будет работать, несмотря ни на что
3. На самом деле я использую Qt (в частности, QJSEngine), который утверждает, что совместим с ES6, хотя у меня начинают возникать сомнения. Тем не менее, такие свойства, как
b.z
добавляются без каких-либо проблем, так что, очевидно, что-то было вызвано, но по какой-то причине оно не добавляет функции из прототипа.
Ответ №2:
Итак, оказывается, Qt (который я использовал) предпочитает синтаксис класса ES6 для выполнения того, что я пытался заставить его делать. Как только я переключился на это, импорт / экспорт и наследование и все остальное сработали. Спасибо всем, кто прокомментировал, теперь я могу отметить это как решенное.