为什么在JavaScript原型函数中使用全局函数?

时间:2012-02-08 23:34:04

标签: javascript coffeescript

我来自Java / C ++ OOP背景,我正试图进入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如何处理函数和对象(或者更确切地说,函数作为对象)?

2 个答案:

答案 0 :(得分:2)

这看起来像编译器优化,可能是CoffeeScript翻译的结果。

可能正在尝试在不同的上下文中重用此函数。您可以将任何对象传递给_MyObjectGetX,它将返回该对象的x属性。因此,如果它检测到两个执行相同功能的方法,它可以优化其中一个并减少应用程序的内存占用。

答案 1 :(得分: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函数似乎没有获得简单回报。实际上,由于没有提供封装,因此实际上似乎都没有合法使用getter。无论在何处传递,x属性都可以在对象上随时可用(并且可以修改)。

我有一些理由为什么框架选择这样做......但是对于这个简单的例子,我不明白。