我想创建一个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
。这感觉不对。
我发现了许多解决方案如何使用新的构造函数和构造函数包装器来实现它,但我希望尽可能简单(它只是一个简单的点)。
有没有更简单的方法来实现这种行为?
答案 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;
}