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

Why use global functions inside JavaScript prototype functions?

本文关键字:函数 全局 为什么 JavaScript 原型      更新时间:2023-09-26

我来自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如何处理函数和对象(或者更确切地说,函数对象)?

编辑:对不起,误解了你的问题。

在这种情况下,看起来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属性在对象上随时可用(并且可以修改),无论它被传递到哪里。

框架选择这样做可能有一些原因。。。但对于这个简单的例子,我不理解。

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

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