如何识别函数是类构造函数以及如何将其作为函数调用?

时间:2016-11-17 13:46:03

标签: javascript es6-class

我对es2016中的class功能有点困惑,虽然与functionprototype相比,它被认为只是创建类的语法糖,但在某些情况下行为是不同的,特别是 - 类不能被称为函数相同,似乎没有办法找出函数是类构造函数还是简单函数,而不使用{{1} }和toString /^class/

假设示例:

RegExp

class Foo { constructor () { this.name = 'foo'; } } function Bar () { this.name = 'bar'; } function doSmth (anyArg) { if (typeof anyArg === 'function') { var obj = { someProp: 'qux' }; anyArg.call(obj); return obj; } // ... } doSmth(Bar); doSmth(Foo); // Class constructor Foo cannot be invoked without 'new' ,但不能将其称为函数!尼斯。

这是我的两个问题:

  1. 我是否可以使用覆盖typeof 'function'上下文来调用Foo构造函数与Bar相同?
  2. 我是否有某种方法可以检测到this是类的构造函数,我可以在anyArg函数中以不同方式处理它。没有doSmthtoString,因为在这种情况下性能损失将是巨大的)。然后,我可以使用RegExp初始化新实例,然后Reflect.construct使用实例中的值扩展我的Object.assign变量。
  3. 谢谢你,Alex

3 个答案:

答案 0 :(得分:0)

我不知道如何在第一个问题中做出你的要求。

对于第二个问题,您实际上确定了一种方法来区分自己。类构造函数和用作构造函数的函数之间的区别之一是前者在没有Html Webpack Plugin: <pre> TypeError: Cannot read property 'title' of undefined - index.html:77 D:/projects/living/user-platform/project/src/index.html:77:33 - index.html:94 module.exports D:/projects/living/user-platform/project/src/index.html:94:3 - index.js:255 [project]/[html-webpack-plugin]/index.js:255:16 - util.js:16 tryCatcher [project]/[html-webpack-plugin]/[bluebird]/js/release/util.js:16:23 - promise.js:510 Promise._settlePromiseFromHandler [project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:510:31 - promise.js:567 Promise._settlePromise [project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:567:18 - promise.js:604 Promise._settlePromiseCtx [project]/[html-webpack-plugin]/[bluebird]/js/release/promise.js:604:10 - async.js:143 Async._drainQueue [project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:143:12 - async.js:148 Async._drainQueues [project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:148:10 - async.js:17 Immediate.Async.drainQueues [project]/[html-webpack-plugin]/[bluebird]/js/release/async.js:17:14 </pre> 关键字的情况下使用它时出错,而后者则没有。

所以,如果我们使用try / catch,我们可以粗略地做你想做的事情:

new

要说清楚,我并不是说这是一个好主意,好的代码,或者它有你正在寻找的性能,但我想我会指出可能存在的可能性。

答案 1 :(得分:0)

两个问题都没有。

以下是Angular 1.x如何检测类:

<amp-accordion>
    <section expanded>
        <h2 class="myheader">Section 1</h2>
        <p>Bunch of awesome content</p>
    </section>
    ...

不幸的是,这是最好的解决方案。它甚至在Firefox中也不起作用。

答案 2 :(得分:0)

如果您担心RegEx的性能损失,请使用substring()。如果您仍然关注字符串操作的性能,那么请考虑另一种实际区分函数类型的语言。在JavaScript中,他们都是function

&#13;
&#13;
class Foo {
  constructor() {
    this.name = 'foo';
  }
}

function Bar() {
  this.name = 'bar';
}

function doSmth(anyArg) {
  if (typeof anyArg === 'function') {
    var obj = {
      someProp: 'qux'
    };
    if (anyArg.toString().substring(0, 5) === 'class') {
      Object.assign(obj, new anyArg());
    } else {
      anyArg.call(obj);
    }
    return obj;
  }
  // ...
}

var bar = doSmth(Bar);
var foo = doSmth(Foo);

console.log(bar);
console.log(foo);
&#13;
&#13;
&#13;