Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:将参数传递给对象构造函数_Javascript_Object_Arguments - Fatal编程技术网

javascript:将参数传递给对象构造函数

javascript:将参数传递给对象构造函数,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.

我正在编写一个jquery库,需要实现Datetime函数。 我需要创建一个.Date()函数,它返回一个新的日期对象

如何将my.Date(args)函数的参数传递给日期对象构造函数,以便创建新的日期对象

我试过这样的方法,me是插件名称空间,me=$.jqGUI

        //.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);

    // ...
}