使用带有可变参数列表的`new`运算符创建实例

时间:2013-06-12 10:33:37

标签: javascript constructor arguments instance

我想创建一个Point的实例,包含和不包含new运算符,如:

Point(5, 10); // returns { x: 5, y: 10 }
// or
new Point(5, 10); // also returns { x: 5, y: 10 }

我到目前为止工作with the help of StackOverflow

function Point() {
  if (!(this instanceof Point)) {
    var args = Array.prototype.slice.call(arguments);
    // bring in the context, needed for apply
    args.unshift(null);
    return new (Point.bind.apply(Point, args));
  }
  // determine X and Y values
  var pos = XY(Array.prototype.slice.call(arguments));
  this.x = pos.x;
  this.y = pos.y;
}

但这看起来很可怕,我甚至将null移到了数组中,因此我可以使用apply。这感觉不对。

我发现了许多解决方案如何使用新的构造函数和构造函数包装器来实现它,但我希望尽可能简单(它只是一个简单的点)。

有没有更简单的方法来实现这种行为?

1 个答案:

答案 0 :(得分:2)

如果您不介意使用ECMAScript 5函数,Object.create()可以提供帮助:

function Point()
{   var args = Array.prototype.slice.call(arguments);
    if (this instanceof Point) return Point.apply(null, args);
    var pos = XY(args); 
    var result = Object.create(Point.prototype);
    result.x = pos.x;
    result.y = pos.y;
    return result;
}

如果你需要ECMAScript 3兼容性,那么这个疯狂的,复杂的解决方案又是另一个解决方案(注意它只是内部等价物new Point的包装器):

function Point() 
{   var pos = XY(Array.prototype.slice.call(arguments));
    function internalPoint()
    {   this.x = pos.x;
        this.y = pos.y;
    }
    internalPoint.prototype = Point.prototype;
    return new internalPoint;
}