javascript构造函数之间的区别

时间:2013-02-06 22:30:20

标签: javascript

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

非常感谢任何帮助。请记住,最终目标是将所有函数封装在单个命名空间中。 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 个答案:

答案 0 :(得分:2)

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

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

我想你想要一些变化(copied from link):

+

答案 1 :(得分: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");
    }
}

最后,在编写“命名空间”函数库时,模块模式可能是您最好的朋友。这使您可以维护私有状态而无需正式的构造函数/原型等:

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(); }