2013-02-06 79 views
0

我对这些javascript初始化的哪些(如果有的话)初始化有困惑,因为从我可以tel,他们都做同样的事情。有没有我应该使用一个或另一个的情况? Mt项目要求我将几个函数和命名空间封装在一个对象中,这样我们就不会在全局范围中混淆变量名称,把我特别不清楚+ function(){}();和(function())();javascript构造函数之间的区别

任何帮助将不胜感激。请记住,我们的所有功能的最终目标是封装在单个命名空间中。 IE MyCompany.function,MyCompany.Namepsace.Function ...

<script> 
    var Ford = {}; 
    +function() { 
     Ford.start = function() { 
      console.log("Ford just started"); 
     }; 
    }(); 
    Ford.start(); 
</script> 

<script> 
    var Honda = {}; 
    (function() { 
     Honda.start = function() { 
      console.log("Honda just srtarted"); 
     }; 
    })(); 
    Honda.start(); 
</script> 

<script> 
    var Toyota = function() { 
     return { 
      start: function() { 
       console.log("Toyota just strted"); 
      } 
     }; 
    } 
    var car = new Toyota(); 
    car.start(); 
</script> 
+2

前两个是相同的,但确实需要自我invocing功能is'nt,它也可以同样是一个常规对象文字,第三个更多的是返回一个对象的类,因此是'new'关键字。 – adeneo

+0

@adeneo - 实际上由'new'创建的对象由于'return'而被丢弃。它的功能类似于前两个,不同之处在于它创建了一个新的对象字面值而不是现有的对象 –

+0

是的,第三个是类返回对象的新实例的函数,然后存储在变量中用于初始化'start()'函数。这个问题实际上表明,他们都做同样的事情,所以这意味着什么? +和(在自调用函数上的区别是“没有”,因为返回的结果是无关紧要的。) – adeneo

回答

1

虽然这一切是有效的JS,你让,导致我相信你可能不知道JS如何工作的设想。前两个例子不是通常意义上的构造函数......它们是模块模式,但不是。你可以将它压缩到

var Honda = {}; 
Honda.start = function() { console.log("Honda just started"); } 

忘记自我执行功能。上面显示是类似于你会觉得作为一个static功能在其他语言:

public class Honda { 
    public static void start() { Console.WriteLine("Honda Just Started"); } 
} 

如果你想一个实例功能,你需要或者连接到原型,或将this关键字构造函数:

原型:

var Honda = function() {} 
Honda.prototype.start = function() { console.log("Honda just started"); } 

此:

var Honda = function() { 
    this.start = function(){ 
     console.log("Honda just started"); 
    } 
} 

丰田的最后一个例子表明你对函数构造函数的工作原理有一个根本性的误解。你的对象已经被丢弃,而作为回报,你得到一些对象字面本来可以写成:

var Toyota = { 
    start: function(){ 
     console.log("Toyota just started"); 
    } 
} 

你(可能)打算什么是“这个”模式我上面的本田为例进行说明:

var Toyota = function() { 
    this.start = function() { 
     console.log("Toyota just started"); 
    } 
} 

最后,在编写“namespaced”函数库时,模块模式可能是您最好的朋友。这可以让你保持私有状态,而不需要一个正式的构造函数/原型,等:使用new关键字时,

var MyCompany = {}; 

//car module 
(function(ns){ 
    var module, 
     _isStarted; 

    function start() { console.log('start'); _isStarted = true; } 
    function stop() { console.log('stop'); _isStarted = false; } 
    function isStarted() { return _isStarted; } 

    module = { 
     start: start, 
     stop: stop, 
     isStarted: isStarted 
    } 

    ns.CarModule = module; 
}(MyCompany)); 

//use: 
MyCompany.CarModule.start(); 
if(MyCompany.CarModule.isStarted()) { MyCompany.CarModule.stop(); } 
2

的Javascript功能仅作为调用构造函数。 new创建一个新的对象实例,从构造函数的原型继承,并使this关键字的上下文成为新创建的对象实例。因此,如果您不使用原型继承属性或关键字this在构造函数中创建新属性 - 您并不需要使用构造函数。

我想你要找的是module pattern这是使用immediately invoked functions实现的。前两个示例都使用立即调用的函数。我相信风格(function(){}());+function(){}();更受欢迎。周围的()+都会导致javascript解析器期望函数表达式而不是函数声明,这允许尾部()调用该函数。除了可读性较差+也可能会改变函数的返回值。

我想你想在这个(copied from link)一些变化:

var MODULE = (function() { 
    var module = {}; 
    var privateVariable = 1; 

    function privateMethod() { 
     // ... 
    } 

    module.moduleProperty = 1; 
    module.moduleMethod = function() { 
     // ... 
    }; 

    return module; 
}()); 
+0

好的答案和很好的链接当我第一次开始学习JavaScript的工作方式时,我发现这个新的运算符太迷惑了,于是我决定在可能的时候避免它。感谢你给出了一个很好的描述,尽管我仍然会尽量避免使用它。 – jahroy

相关问题