2012-02-08 121 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; 
}; 

我不明白的是全局函數的用法。假設全局函數僅用於一個地方: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 2012-02-08 23:43:20

+0

@ruakh 如果布蘭登是對的,那麼真正的例子中唯一不同的是一些全局函數在多個對象中被調用。但是,有時情況並非如此。 – WillP 2012-02-09 00:04:02

+0

你有框架的CoffeeScript源代碼嗎?這可能有助於縮小投機範圍。 – ruakh 2012-02-09 02:56:49

回答

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()調用(我總是調用的)全局函數_MyObjectGetX(),而不是僅返回this.x. – WillP 2012-02-09 01:23:07

+0

對不起。誤讀帖子。相應地更新我的答案。 – Gopherkhan 2012-02-09 01:31:23

+0

謝謝。共識似乎是CoffeeScript在不需要時可以優化(或抽象)。自布倫丹首先回答以後,我會把它交給他。太糟糕了,你不能檢查多個答案。 編輯:對不起,沒有看到完整的文章編輯。感謝更長的解釋。 – WillP 2012-02-09 01:36:00

2

這看起來像一個編譯器優化,可能是CoffeeScript翻譯的結果。

它可能試圖在不同的上下文中重用此函數。您可以將任何對象傳遞到_MyObjectGetX,它將返回該對象的x屬性。因此,如果它檢測到執行相同功能的兩種方法,則可以優化其中一種方法並減少應用程序的內存佔用量。

+0

啊,所以也許CoffeeScript假定函數可能會在多個對象中被重用。這就是我正在想的可能會發生的事情。假設函數*不會被重用,那麼返回MyObject的方法是安全的嗎? – WillP 2012-02-09 00:02:05

+0

但它不*優化掉一個方法:它仍然在創建一個方法,但該方法現在是一個外部函數的包裝。 ('MyObject.prototype.getX'仍然是'_MyObjectGetX'的一個獨立函數,它只是調用它。) – ruakh 2012-02-09 00:08:10

+0

@WillP這就是我想的,但我真的不確定CoffeeScript是如何工作的。這似乎是一個很少使用的優化。 – Brandan 2012-02-09 02:45:10

相關問題