2012-02-08 19 views
1

私はJava/C++ OOPのバックグラウンドから来て、JavaScriptの「オブジェクト指向」プログラミングに取り掛かりたいと思っています。私は、小さなフレームワークのソースを見て、私が奇妙に感じたものに気づいた。フレームワークはいくつかのグローバル関数を定義し、オブジェクト関数内からそれらの関数を呼び出します。明確にするために、次の例を示します。なぜJavaScriptプロトタイプ関数内のグローバル関数を使用するのですか?

var MyObject = function() { 

    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return _MyObjectGetX(this); 
    }; 

    return MyObject; 
}(); 

var _MyObjectGetX = function(myObject) { 
    return myObject.x; 
}; 

グローバル機能の使用方法はわかりません。グローバル関数が1つの場所でのみ使用されると仮定しましょう:MyObject.getX()。戻り値を関数本体に移動させるだけではどうですか?これは大丈夫ですか?

var MyObject = function() { 

    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return this.x; 
    }; 

    return MyObject; 
}(); 

このフレームワークはCoffeeScriptで書かれ、JavaScriptに変換されました。 CoffeeScriptが不要なことがあるのでしょうか、またはJavaScriptが関数とオブジェクトを扱う方法を誤解していますか(あるいは、としてオブジェクト)?

+0

実際の例には何らかの理由があるかもしれないが、作成された例には当てはまらないので、本当の例を投稿するほうがよいでしょう。 (その場合は、私は知りませんが、それはかなり可能と思われる。) – ruakh

+0

@ruakh Brandanが右である場合は、実際の例では異なる唯一のものは、グローバル関数のいくつかは、複数のオブジェクトで呼び出さなっていることです。しかし、時にはそうではありません。 – WillP

+0

フレームワークのCoffeeScriptソースコードはありますか?それは投機を絞り込むのに役立つかもしれない。 – ruakh

答えて

2

編集:申し訳ありませんが、あなたの質問を誤解しました。 CoffeeScriptのがちょうど...一種のWYSIWYG生成されたHTMLのような間抜けされるよう

この場合に見えます。

var MyObject = function() {  
    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return _MyObjectGetX(this); // referencing a closure 
    }; 

    return MyObject; 
}(); 

var _MyObjectGetX = function(myObject) { 
    return myObject.x; 
}; 

本当に単純

 var MyObject = function() { 
      this.x = 5; 
     }; 

     MyObject.prototype.getX = function() { 
      return this.x; 
     }; 

に対して何ら利点を持っていない、トップのCoffeeScriptの例で使用される外側のgetter関数は、単純なリターンに対して何らの利得を持っていないようです。実際、カプセル化が提供されていないので、実際にはゲッターの正当な使用は実際にはありません。 xプロパティは、渡された場所に関係なく、オブジェクト上で簡単に利用可能(変更可能)です。フレームワークはこれを実行することを選んだ理由

はいくつかの理由があり、私の...しかし、この単純な例のために私は理解していません。

+0

私はMyObjectがグローバル関数ではないことを理解していますが、私は本当に "MyObject"について話していませんでした。私は、MyObject.prototype.getX()を呼び出して、this.xを返すのではなく、グローバル関数_MyObjectGetX()を呼び出していました。 – WillP

+0

申し訳ありません。投稿を誤解するそれに応じて私の答えを更新。 – Gopherkhan

+0

ありがとうございます。コンセンサスは、CoffeeScriptが必要でない場合に最適化(または抽象化)しているように思われる。ブレンダンが最初に答えたので、私は彼にそれを与えるつもりです。あなたが1つ以上の答えをチェックすることはできません。 編集:申し訳ありませんが、完全な投稿編集が表示されませんでした。長い説明に感謝します。 – WillP

2

これはコンパイラの最適化のように見えます。おそらくCoffeeScriptの翻訳の結果です。

この関数を別のコンテキストで再利用しようとしている可能性があります。任意のオブジェクトを_MyObjectGetXに渡すと、そのオブジェクトのxプロパティが返されます。したがって、同じ機能を実行する2つのメソッドが検出された場合、それらのメソッドの1つを最適化して、アプリケーションのメモリフットプリントを減らすことができます。

+0

ああ、多分CoffeeScriptはその関数が複数のオブジェクトで再利用されるかもしれないと仮定します。それは私が起こっているかもしれないと思っていたものです。関数*が再利用されないと仮定すると、MyObjectのメソッドの中に戻るだけで安全です。 – WillP

+0

しかし、メソッドを最適化するのではなく、まだメソッドを作成していますが、そのメソッドは外部関数のラッパーになりました。 ( 'MyObject.prototype.getX'は依然として' _MyObjectGetX'とは別の機能ですが、単に呼び出すだけです。) – ruakh

+0

@WillPこれは私が考えていたものですが、CoffeeScriptがどのように動作するのかは分かりません。非常にめったに使用されない最適化であるようです。 – Brandan

関連する問題