ES6/Babel Class 没有 'new' 就无法调用构造函数
ES6/Babel Class constructor cannot be invoked without 'new'
我正在尝试创建自定义 Quill 主题,扩展气泡主题。我面临一个奇怪的 ES6 继承问题,似乎我无法在我的构造函数中调用 super()
。这是我的代码:
import BubbleTheme, { BubbleTooltip } from 'quill/themes/bubble'
class LoopTheme extends BubbleTheme {
constructor (quill, options) {
super(quill, options)
}
extendToolbar (toolbar) {
super.extendToolbar(toolbar)
this.tooltip = new LoopTooltip(this.quill, this.options.bounds);
this.tooltip.root.appendChild(toolbar.container);
}
}
class LoopTooltip extends BubbleTooltip {
}
LoopTooltip.TEMPLATE = [
'<span class="ql-tooltip-arrow"></span>',
'<div class="ql-tooltip-editor">',
'<input type="text" data-formula="e=mc^2" data-link="https://myurl.com" data-video="Embed URL">',
'<a class="ql-close"></a>',
'</div>'
].join('');
export { LoopTooltip, LoopTheme as default }
可以找到气泡主题here
我的 Babel 预设:
{
"presets": [
"es2015",
"es2016",
"stage-0",
"react"
]
}
Webpack js文件配置:
module: {
rules: [
{
test: /\.js$/,
include: [
resolve(__dirname, 'app')
],
loader: 'babel-loader',
exclude: /node_modules/
}, {...
输出生成的代码:
var LoopTheme = function (_BubbleTheme) {
_inherits(LoopTheme, _BubbleTheme);
function LoopTheme() {
_classCallCheck(this, LoopTheme);
return _possibleConstructorReturn(this, (LoopTheme.__proto__ || Object.getPrototypeOf(LoopTheme)).apply(this, arguments));
}
_createClass(LoopTheme, [{
key: 'extendToolbar',
value: function extendToolbar(toolbar) {
_get(LoopTheme.prototype.__proto__ || Object.getPrototypeOf(LoopTheme.prototype), 'extendToolbar', this).call(this, toolbar);
this.tooltip = new LoopTooltip(this.quill, this.options.bounds);
this.tooltip.root.appendChild(toolbar.container);
}
}]);
return LoopTheme;
}(_bubble2.default);
var LoopTooltip = function (_BubbleTooltip) {
_inherits(LoopTooltip, _BubbleTooltip);
function LoopTooltip() {
_classCallCheck(this, LoopTooltip);
return _possibleConstructorReturn(this, (LoopTooltip.__proto__ || Object.getPrototypeOf(LoopTooltip)).apply(this, arguments));
}
return LoopTooltip;
}(_bubble.BubbleTooltip);
LoopTooltip.TEMPLATE = ['<span class="ql-tooltip-arrow"></span>', '<div class="ql-tooltip-editor">', '<input type="text" data-formula="e=mc^2" data-link="myurl.com" data-video="Embed URL">', '<a class="ql-close"></a>', '</div>'].join('');
exports.LoopTooltip = LoopTooltip;
exports.default = LoopTheme;
我遇到以下错误:events.js:59 Uncaught TypeError: Class constructor BubbleTheme cannot be invoked without 'new'
。但是,LoopTheme
被 Quill here 使用 new
正确调用。我一步一步调试的时候,正确的进入了LoopTheme
构造函数,调用super
的时候报错
我是不是漏掉了什么?我一直使用继承,我在我的代码中的其他地方使用它(在我的 类 之间),我在哪里遇到问题?
感谢您的帮助
我 运行 在扩展 Quill 的 BaseTheme
时遇到了完全相同的问题。
正如 Bergi 在上面的评论中正确指出的那样,这与 babel-loader
不是 t运行spiling Quill 的模块这一事实有关,因为它们在 node_modules/
中, 被排除在外。
您可以更新 Webpack 配置中的 exclude
选项并使用正则表达式跳过 node_modules/quill/
文件夹或使用 include
代替:
{
test: /\.js$/,
loader: 'babel-loader',
include: [
path.join(__dirname, '../src'), // + any other paths that need to be transpiled
/\/node_modules\/quill/,
]
}
你也可以这样替换:
import BubbleTheme from 'quill/themes/bubble'
进入这个:
const BubbleTheme = Quill.import('themes/bubble')
我想建议另一种方法。如果您没有在管道中构建 quill,您可以很好地引用扩展 class.
上方的运行时构造函数
import { sanitize } from 'quill/formats/link';
let BlockEmbed = window['Quill'].import('blots/block/embed');
export class MediaBlot extends BlockEmbed {
...
}
我正在尝试创建自定义 Quill 主题,扩展气泡主题。我面临一个奇怪的 ES6 继承问题,似乎我无法在我的构造函数中调用 super()
。这是我的代码:
import BubbleTheme, { BubbleTooltip } from 'quill/themes/bubble'
class LoopTheme extends BubbleTheme {
constructor (quill, options) {
super(quill, options)
}
extendToolbar (toolbar) {
super.extendToolbar(toolbar)
this.tooltip = new LoopTooltip(this.quill, this.options.bounds);
this.tooltip.root.appendChild(toolbar.container);
}
}
class LoopTooltip extends BubbleTooltip {
}
LoopTooltip.TEMPLATE = [
'<span class="ql-tooltip-arrow"></span>',
'<div class="ql-tooltip-editor">',
'<input type="text" data-formula="e=mc^2" data-link="https://myurl.com" data-video="Embed URL">',
'<a class="ql-close"></a>',
'</div>'
].join('');
export { LoopTooltip, LoopTheme as default }
可以找到气泡主题here
我的 Babel 预设:
{
"presets": [
"es2015",
"es2016",
"stage-0",
"react"
]
}
Webpack js文件配置:
module: {
rules: [
{
test: /\.js$/,
include: [
resolve(__dirname, 'app')
],
loader: 'babel-loader',
exclude: /node_modules/
}, {...
输出生成的代码:
var LoopTheme = function (_BubbleTheme) {
_inherits(LoopTheme, _BubbleTheme);
function LoopTheme() {
_classCallCheck(this, LoopTheme);
return _possibleConstructorReturn(this, (LoopTheme.__proto__ || Object.getPrototypeOf(LoopTheme)).apply(this, arguments));
}
_createClass(LoopTheme, [{
key: 'extendToolbar',
value: function extendToolbar(toolbar) {
_get(LoopTheme.prototype.__proto__ || Object.getPrototypeOf(LoopTheme.prototype), 'extendToolbar', this).call(this, toolbar);
this.tooltip = new LoopTooltip(this.quill, this.options.bounds);
this.tooltip.root.appendChild(toolbar.container);
}
}]);
return LoopTheme;
}(_bubble2.default);
var LoopTooltip = function (_BubbleTooltip) {
_inherits(LoopTooltip, _BubbleTooltip);
function LoopTooltip() {
_classCallCheck(this, LoopTooltip);
return _possibleConstructorReturn(this, (LoopTooltip.__proto__ || Object.getPrototypeOf(LoopTooltip)).apply(this, arguments));
}
return LoopTooltip;
}(_bubble.BubbleTooltip);
LoopTooltip.TEMPLATE = ['<span class="ql-tooltip-arrow"></span>', '<div class="ql-tooltip-editor">', '<input type="text" data-formula="e=mc^2" data-link="myurl.com" data-video="Embed URL">', '<a class="ql-close"></a>', '</div>'].join('');
exports.LoopTooltip = LoopTooltip;
exports.default = LoopTheme;
我遇到以下错误:events.js:59 Uncaught TypeError: Class constructor BubbleTheme cannot be invoked without 'new'
。但是,LoopTheme
被 Quill here 使用 new
正确调用。我一步一步调试的时候,正确的进入了LoopTheme
构造函数,调用super
的时候报错
我是不是漏掉了什么?我一直使用继承,我在我的代码中的其他地方使用它(在我的 类 之间),我在哪里遇到问题?
感谢您的帮助
我 运行 在扩展 Quill 的 BaseTheme
时遇到了完全相同的问题。
正如 Bergi 在上面的评论中正确指出的那样,这与 babel-loader
不是 t运行spiling Quill 的模块这一事实有关,因为它们在 node_modules/
中, 被排除在外。
您可以更新 Webpack 配置中的 exclude
选项并使用正则表达式跳过 node_modules/quill/
文件夹或使用 include
代替:
{
test: /\.js$/,
loader: 'babel-loader',
include: [
path.join(__dirname, '../src'), // + any other paths that need to be transpiled
/\/node_modules\/quill/,
]
}
你也可以这样替换:
import BubbleTheme from 'quill/themes/bubble'
进入这个:
const BubbleTheme = Quill.import('themes/bubble')
我想建议另一种方法。如果您没有在管道中构建 quill,您可以很好地引用扩展 class.
上方的运行时构造函数 import { sanitize } from 'quill/formats/link';
let BlockEmbed = window['Quill'].import('blots/block/embed');
export class MediaBlot extends BlockEmbed {
...
}