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