javascript:将参数传递给对象构造函数
我正在编写一个jquery库,需要实现Datetime函数。 我需要创建一个.Date()函数,它返回一个新的日期对象 如何将my.Date(args)函数的参数传递给日期对象构造函数,以便创建新的日期对象 我试过这样的方法,me是插件名称空间,me=$.jqGUIjavascript:将参数传递给对象构造函数,javascript,object,arguments,Javascript,Object,Arguments,我正在编写一个jquery库,需要实现Datetime函数。 我需要创建一个.Date()函数,它返回一个新的日期对象 如何将my.Date(args)函数的参数传递给日期对象构造函数,以便创建新的日期对象 我试过这样的方法,me是插件名称空间,me=$.jqGUI //.Date(Value) /* Return a date object. * ReturnValue = Date(Value) */ me.
//.Date(Value)
/* Return a date object.
* ReturnValue = Date(Value)
*/
me.Date = function(Value){
//pass arguments to Date constructor
var sDate = Date.prototype.constructor.apply(null, arguments);
console.log(sDate);
//create a date object d
var d = new Date(sDate);
//validate date object
if(d.toDateString()=="Invalid Date"){
throw new Error("$.jqGUI.Date: Invalid Date");
}
else{
return d;
}
};
在这里,我将参数传递给Date.prototype.constructor,但无论如何,我都会得到当前日期。
如果参数是日期字符串,则忽略它。
为什么?
非常无用,只需使用Date
-函数就是构造函数
.apply(null, ...
您需要在新创建的该类型的对象上应用构造函数,而不是在null
上。看
但是,不可能应用真正的Date
构造函数(用于new
的函数),因为EcmaScript指定当调用Date
函数时,它必须返回当前UTC时间
无论如何,你不应该需要这个。与其接收一堆参数(大小可变),不如将参数指定为
Date
对象。函数的用户可以按照自己的意愿构建它
看起来奇怪的函数似乎与Date
构造函数的作用完全相同。扔掉它,让用户自己应用Date
——他知道自己想要哪种格式
此外,如果(d.toDateString()=“无效日期”),则不应使用,这不是标准化的,而是依赖于实现。要检查有效的Date
对象,只需使用isNaN
-不可解析日期的内部表示(日期Date
实例的值)为NaN
建议:
me.date = function(d) {
/* gets: a Date object or something that can be transformed to a Date
returns: a valid Date object, else throws an Error */
d = new Date(d); // works also for Date instances, uncouples them
// else creates new one from string or number
if (isNaN(d))
throw new Error("$.jqGUI.Date: Invalid Date");
return d;
};
对我来说,以下是有效的
var args = [];
for(var i = 0; i < arguments.length; i++)
args.push("arguments[" + i + "]");
var d = eval("new Date(" + args.join(",") + ")");
var args=[];
for(var i=0;i
如果目标浏览器不支持ECMAScript 5 Function.prototype.bind,则代码将无法工作。但可能性不大,请参见。公认的答案并不理想。我只希望任何读到这篇文章的人都能进一步调查。使用“eval”有很多副作用,我认为您不希望在util库中使用这些副作用
以下是您可以做的大致情况:
function dateShimmer() {
if(arguments.length === 1){
return new Date(arguments[0]);
}
else if(arguments.length > 1){
return dateArgumentShimmer.apply(null, arguments);
}
return new Date();
}
function dateArgumentShimmer(a1, a2, a3, a4, a5, a6, a7){
//Direct invocation is faster than apply/call
switch(arguments.length){
case 2: return new Date(a1, a2);
case 3: return new Date(a1, a2, a3);
case 4: return new Date(a1, a2, a3, a4);
case 5: return new Date(a1, a2, a3, a4, a5);
case 6: return new Date(a1, a2, a3, a4, a5, a6);
case 7: return new Date(a1, a2, a3, a4, a5, a6, a7);
}
};
jshiddle这里:一些注意事项:
- 切勿使用
eval
,这很危险
bind
并非始终可用,正如所指出的,垫片的工作原理不同
- 还接受一个变量参数列表并返回一个标量,该标量可由
Date
构造函数使用
apply
只需要类似数组的对象,而不需要实际的数组,因此参数
就足够了
这是我首选的、浏览器安全的、完全可变的方法。请注意它如何处理不带日期的参数。Date.now()
。传递null
与不传递参数不同,因此允许执行相同的操作
me.Date = function(value){
if (arguments.length < 1) value = Date.now();
else if (arguments.length > 1) value = Date.UTC.apply(null, arguments);
var d = new Date(value);
// ...
}
me.Date=函数(值){
如果(arguments.length<1)value=Date.now();
如果(arguments.length>1)value=Date.UTC.apply(null,arguments),则为else;
var d=新日期(值);
// ...
}
Date.prototype.constructor
完全等同于Date
的可能副本,我认为您不应该在这里使用eval,因为它的速度很慢。您真的需要创建自己的日期函数吗?是的,而且不仅是日期函数,它还可以用于其他对象。另一方面,评估有多慢?大多数人都有配备icore pentium和大量内存的现代机器。我认为这样的机器不会有任何问题;log(“evil>:(“
Nice!”但是您应该添加一个注意事项,这不太可能适用于任何bind
垫片。
function dateShimmer() {
if(arguments.length === 1){
return new Date(arguments[0]);
}
else if(arguments.length > 1){
return dateArgumentShimmer.apply(null, arguments);
}
return new Date();
}
function dateArgumentShimmer(a1, a2, a3, a4, a5, a6, a7){
//Direct invocation is faster than apply/call
switch(arguments.length){
case 2: return new Date(a1, a2);
case 3: return new Date(a1, a2, a3);
case 4: return new Date(a1, a2, a3, a4);
case 5: return new Date(a1, a2, a3, a4, a5);
case 6: return new Date(a1, a2, a3, a4, a5, a6);
case 7: return new Date(a1, a2, a3, a4, a5, a6, a7);
}
};
me.Date = function(value){
if (arguments.length < 1) value = Date.now();
else if (arguments.length > 1) value = Date.UTC.apply(null, arguments);
var d = new Date(value);
// ...
}