0

DateJavascript のネイティブオブジェクト タイプのラッパーを作成したいと考えています。日付に固有の各プロパティについて、クラスが所有する日付に単純にプロキシしたいと思います。コーヒースクリプトを使用していますが、日付オブジェクトを変更するメソッドを除いてすべてが機能しているようです。バインディングの設定が間違っているのではないかと思っています。

これが私がこれまでに持っているものです。コンパイルしたものをチェックアウトすると(JSLintでうまく動作するように変更されていますが、ブラウザで見ているものと同じ動作です)、その動作を確認できます:http://jsfiddle.net/XRgKM/1/

class CP.MyDate

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

  constructor: (@date = new Date()) ->
    # Hack to allow me to use the __bind function like the rest of the
    # 'coffeescript native' class functions:
    bnd = `__bind`
    for name in MyDate.DateProperties
      bnd(@[name], @)

    # Validate parameter:
    if not @date instanceof Date
      throw new Error("date must be a native date")

    # Copy date locally:
    @date = new Date(@date)

  test: () => alert("TEST")

  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
4

1 に答える 1

1

ループ問題の中に標準的な閉鎖があります。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 には役立つdoキーワードがあります。

JavaScript ループを使用して関数を生成する場合、ループ変数が確実に閉じられるようにするためにクロージャー ラッパーを挿入するのが一般的であり、生成されたすべての関数が最終的な値を共有するだけではありません。CoffeeScript はdoキーワードを提供します。このキーワードは、渡された関数をすぐに呼び出し、引数を転送します。

あなたはこれをしたい:

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

デモ: http://jsfiddle.net/ambiguous/8gc7b/

また、jsfiddle は CoffeeScript をサポートしていることにも注意してください。サイドバーの [パネル] の下を見てください。

そして、そのように見えるようにする必要はありませんDateProperties。非表示にすることができます:

class CP.MyDate

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

クラスのすぐDateProperties内側を参照してください。CP.MyDate

于 2012-10-06T00:06:24.600 に答える