Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date_Coffeescript_Prototype - Fatal编程技术网

Javascript 扩展或包装本机日期对象

Javascript 扩展或包装本机日期对象,javascript,date,coffeescript,prototype,Javascript,Date,Coffeescript,Prototype,我想围绕Javascript的本机Date对象类型编写一个包装器。对于日期的每个本机属性,我只想将其代理到我的类所拥有的日期。我使用的是coffee脚本,除了改变date对象的任何方法之外,其他一切似乎都正常工作。我想知道我是否设置了不正确的绑定 这是我到目前为止所拥有的。如果您签出它所包含的内容(修改后可以很好地使用JSLint,但行为与我在浏览器中看到的相同),您可以看到它的行为: 在循环问题中存在标准闭包。您认为这里的函数中的name将是什么 for name in @DateProper

我想围绕Javascript的本机
Date
对象类型编写一个包装器。对于日期的每个本机属性,我只想将其代理到我的类所拥有的日期。我使用的是coffee脚本,除了改变date对象的任何方法之外,其他一切似乎都正常工作。我想知道我是否设置了不正确的绑定

这是我到目前为止所拥有的。如果您签出它所包含的内容(修改后可以很好地使用JSLint,但行为与我在浏览器中看到的相同),您可以看到它的行为:

在循环问题中存在标准闭包。您认为这里的函数中的
name
将是什么

for name in @DateProperties
  MyDate.prototype[name] = () ->
    returnVal = @date[name].apply(@date, arguments)
    if returnVal isnt @date and returnVal instanceof Date
      returnVal = new MyDate(returnVal)
    return returnVal
在函数中,
name
将是
@DateProperties
的最后一个值,这与您想要的完全不同。您需要将
name
的当前值输入函数,而不是
name
引用。由于这是一件很常见的事情,CoffeeScript有以下帮助:

当使用JavaScript循环生成函数时,通常会插入一个闭包包装器,以确保循环变量被关闭,并且所有生成的函数不只是共享最终值。CoffeeScript提供
do
关键字,该关键字立即调用传递的函数,转发任何参数

您要执行以下操作:

for name in @DateProperties
  do (name) ->
    # Carry on as before...
演示:

还要注意,JSFIDLE支持CoffeeScript,请查看侧栏中的面板

您不需要让
DateProperties
像这样可见,您可以隐藏它:

class CP.MyDate

  DateProperties = (name for name in Object.getOwnPropertyNames(window.Date.prototype) when _.isFunction(window.Date.prototype[name]))

请参阅
CP.MyDate
课程中的
DateProperties

非常感谢。我觉得有点傻。我很确定我以前用其他语言回答过这个问题。。。。
class CP.MyDate

  DateProperties = (name for name in Object.getOwnPropertyNames(window.Date.prototype) when _.isFunction(window.Date.prototype[name]))