如何在JavaScript中定义实例化函数的行为

时间:2016-03-01 11:45:36

标签: javascript

使用ES2015,我想扩展Function类并将其实例用作可调用函数。

class Foo extends Function {
  // how to wite behavior?
}

let foo = new Foo();

foo();
foo.call();
// this is callable, but no behavior defined

如何让foo在其声明中具有特定的行为?

2 个答案:

答案 0 :(得分:2)

原始函数构造函数将字符串作为参数,因此如果您没有覆盖构造函数,以下内容应该适用于您:

const foo = new Foo("console.log(42)");
foo(); // outputs 42.

答案 1 :(得分:2)

Function构造函数accepts arguments

  

new Function ([arg1[, arg2[, ...argN]],] functionBody)

在这种情况下,您可以使用适当的参数调用super



// SNIPPET ONLY WORKS ON ES2015-ENABLED BROWSERS
"use strict";
class Foo extends Function {
  constructor() {
    super("a", "snippet.log(a);")
  }
}

let foo = new Foo();

foo("one");
foo.call(null, "two");

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

现在,在字符串文字中编写JavaScript代码很痛苦,函数文本中的代码在全局范围内进行评估,因此我们无法在构造函数中定义实际函数,从函数文本中调用它。所以这个用途有限。但...