创建实例,不带' new '操作符,参数列表可变
Create instance without `new` operator with variable argument list
我想创建一个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
。这感觉不太对。
我找到了很多解决方案,如何用新的构造函数和构造函数包装器来实现它,但我想保持它尽可能简单(它只是一个简单的点)。
是否有更简单的方法来实现这个行为?
如果你不介意使用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;
}
相关文章:
- 参数列表Three.js之后的未捕获语法错误:缺少)
- 如何将参数从列表视图中的项传递到模板
- 在url参数javascript中存储键值对列表
- 是否可以在javascript函数参数列表中调用多个函数
- 在JS的下拉列表中选择多个输入参数
- 参数列表(节点)后缺少)
- 从从字符串创建的函数中获取参数列表
- 参数列表后缺少未捕获的语法错误)
- 参数列表Javascript Jquery后缺少)
- 在带有参数列表的表单submit上调用一个方法
- 参数列表后的未捕获语法错误:缺少)
- 使用URL参数选择的下拉列表
- 参数列表[Javascript语法错误]后的未捕获语法错误:缺少)
- 如何跟踪有序列表中的顺序,该列表具有一个循环列表项,提供不同的参数
- 删除元素并将其添加到 javascript 中的函数参数列表中
- 缺少)在参数列表之后,这次我把它放在哪里
- Javascript ( jQuery ) 错误: 语法错误: 缺少 ) 在参数列表之后
- 如何在 JavaScript 中创建列表参数来调用 WCF-Webservice
- 如何使用 JQuery 从多个选择输入生成列表参数
- 嵌入youtube视频与播放列表参数