2

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

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

到目前为止,我在 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. 那感觉不对。

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

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

4

1 回答 1

3

如果您不介意使用 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;
}
于 2013-06-12T11:09:57.443 回答