我来自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如何处理函数和对象(或者更确切地说,函数作为对象)?
答案 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属性都可以在对象上随时可用(并且可以修改)。
我有一些理由为什么框架选择这样做......但是对于这个简单的例子,我不明白。