引用:http://ejohn.org/blog/simple-class-instantiation/

// makeClass - By John Resig (MIT Licensed)
function makeClass(){
  return function(args){
    if ( this instanceof arguments.callee ) {
      if ( typeof this.init == "function" )
        this.init.apply( this, args.callee ? args : arguments );
    } else
      return new arguments.callee( arguments );
  };
}

我想知道是否有任何ECMAScript 5兼容方式来实现相同功能。问题是,在严格模式下不赞成访问arguments.callee

最佳答案

据我了解,在严格模式下不建议弃用arguments.callee,在这种情况下,您可以继续使用它。相反,它已被删除,尝试使用将(或应该)引发异常。

解决方法是使用命名匿名函数,如果您会原谅oxymoron。真的,我应该说"named function expressions"。一个例子:

function someFunc(){
  return function funcExpressionName(args){
    if (this instanceof funcExpressionName) {
      // do something
    } else
      return new funcExpressionName( arguments );
  };
}

在我的示例中,您提供的名称funcExpressionName不应从任何地方访问,除非它适用于该函数内部,但是不幸的是IE还有其他想法(如您所看到的Google it所示)。

对于您问题中的示例,我不确定如何处理args.callee,因为我不知道调用函数如何设置它,但是按照我的示例将替换arguments.callee的使用。

09-20 17:32