如何在 ES6 中获取对 class 函数的引用?
How to get a reference to a class function in ES6?
抱歉,如果问题太简单,但我在这里遗漏了一些东西。
刚刚切换了一个 ES5 模块,看起来像:
module.exports = {
func1: function(a, b) {...},
func2: function(a, b) {...}
};
ES6 class 看起来像这样:
export default class {
func1(a, b) {...}
func2(a, b) {...}
}
一切都很好:在这两种情况下,我都可以 export mod from 'module';
并调用 mod.func1(a, b)
和 mod.func2(a, b)
。
但是,我有一个函数接收要调用的模块函数:
var caller = function(func, val1, val2) {
let a = something(val1);
let b = something(val2);
return func(a, b);
};
当我调用 caller(mod.func1, x, y)
时,我在第一个实现中得到了想要的结果,但在第二个实现中得到了 undefined is not a function
。
在这两种情况下都打印出 mod.func1
returns [Function]
的值,但显然从 ES6 class 返回了其他内容。
我做错了什么,我怎样才能得到一个可以在另一个函数中调用的 class 函数?
更新: 第二次实现,忘记添加实例化代码了:
import Mod from 'module';
var mod = new Mod();
class MyClass {
method(args) {}
}
是以下简称:
function MyClass() {}
MyClass.prototype.method = function(args){};
你要找的是构造函数上的一个static
方法,在ES{3,5}中是这样实现的:
function MyClass() {}
MyClass.method = function(args){};
并且在 ES6 中使用 static
修饰符完成:
export default class {
static func1(a, b) { /* stuff */ }
static func2(a, b) { /* stuff */ }
}
但是,即使在对象中也可以使用简写方法,因此在一般情况下使用普通对象会更清晰:
export default {
func1(a, b) {/* stuff */},
func2(a, b) {/* stuff */}
}
为什么构造函数中没有可用的原型方法?
因为在 ES3 或 ES5 中不是这样的:
function MyClass() {};
MyClass.prototype.method = function(args) {};
MyClass.method // undefined
var instance = new MyClass();
instance.method // function(args) {}
必须创建实例才能访问原型上的方法。
您为什么切换到 class
构造(这不仅仅是构造函数和带有方法的原型的语法糖)?没有理由不像以前那样使用对象字面量——您也可以在其中使用方法语法:
export default {
func1(a, b) {...},
func2(a, b) {...}
};
与其使用 "static" 方法导出对象,不如在这里使用命名导出更合理:
export function func1(a, b) {...}
export function func2(a, b) {...}
如果您想将 mod
用作命名空间,可以通过 import * as mod from 'module'
导入。
抱歉,如果问题太简单,但我在这里遗漏了一些东西。 刚刚切换了一个 ES5 模块,看起来像:
module.exports = {
func1: function(a, b) {...},
func2: function(a, b) {...}
};
ES6 class 看起来像这样:
export default class {
func1(a, b) {...}
func2(a, b) {...}
}
一切都很好:在这两种情况下,我都可以 export mod from 'module';
并调用 mod.func1(a, b)
和 mod.func2(a, b)
。
但是,我有一个函数接收要调用的模块函数:
var caller = function(func, val1, val2) {
let a = something(val1);
let b = something(val2);
return func(a, b);
};
当我调用 caller(mod.func1, x, y)
时,我在第一个实现中得到了想要的结果,但在第二个实现中得到了 undefined is not a function
。
在这两种情况下都打印出 mod.func1
returns [Function]
的值,但显然从 ES6 class 返回了其他内容。
我做错了什么,我怎样才能得到一个可以在另一个函数中调用的 class 函数?
更新: 第二次实现,忘记添加实例化代码了:
import Mod from 'module';
var mod = new Mod();
class MyClass {
method(args) {}
}
是以下简称:
function MyClass() {}
MyClass.prototype.method = function(args){};
你要找的是构造函数上的一个static
方法,在ES{3,5}中是这样实现的:
function MyClass() {}
MyClass.method = function(args){};
并且在 ES6 中使用 static
修饰符完成:
export default class {
static func1(a, b) { /* stuff */ }
static func2(a, b) { /* stuff */ }
}
但是,即使在对象中也可以使用简写方法,因此在一般情况下使用普通对象会更清晰:
export default {
func1(a, b) {/* stuff */},
func2(a, b) {/* stuff */}
}
为什么构造函数中没有可用的原型方法?
因为在 ES3 或 ES5 中不是这样的:
function MyClass() {};
MyClass.prototype.method = function(args) {};
MyClass.method // undefined
var instance = new MyClass();
instance.method // function(args) {}
必须创建实例才能访问原型上的方法。
您为什么切换到 class
构造(这不仅仅是构造函数和带有方法的原型的语法糖)?没有理由不像以前那样使用对象字面量——您也可以在其中使用方法语法:
export default {
func1(a, b) {...},
func2(a, b) {...}
};
与其使用 "static" 方法导出对象,不如在这里使用命名导出更合理:
export function func1(a, b) {...}
export function func2(a, b) {...}
如果您想将 mod
用作命名空间,可以通过 import * as mod from 'module'
导入。