检测构造函数(符号) - ES6

时间:2016-01-31 12:29:29

标签: javascript constructor ecmascript-6 symbols

我正在检查ES6功能,Symbol类型为我创建了一个问题。

使用ES6,我们无法在new上应用Symbol()运算符。当我们这样做时,它会抛出一个错误。并且它检查函数是否被用作构造函数。那么,它是如何检查函数是否在幕后使用作为构造函数? (实施可能会因平台而异。)

您能分享任何示例实现吗?

2 个答案:

答案 0 :(得分:3)

要与new一起使用,Function对象必须具有内部[[Construct]]属性。虽然普通的用户定义函数确实自动设置了它,但对于内置函数来说不一定如此:

new Symbol()   // nope
new Math.cos() // nope

ES6箭头和方法也没有[[Construct]]

fn = (x) => alert(x);
new fn(); // nope

class Y {
  foo() {
  }
}

let y = new Y();
new y.foo(); // nope

答案 1 :(得分:1)

当函数作为构造函数调用时,this将成为此函数的原型。您可以检查它并抛出错误:

function NotConstructor() {
  if(this instanceof NotConstructor) {
    throw new Error('Attempt using function as constructor detected!')
  }
  console.log('ok');
}

NotConstructor();  // 'ok'
new NotConstructor(); // throws Error

此外,请参阅相关问题How to detect if a function is called as constructor?,它有更多详细信息和见解。