2012-02-08 78 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

相关问题