0

我对这些javascript中的哪个(如果有的话)初始化使用有点困惑,据我所知,它们都做同样的事情。在某些情况下我应该使用其中一种吗?Mt 项目要求我将多个函数和命名空间封装在一个对象中,这样我们就不会用变量名混淆全局范围,我特别不清楚 +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>
4

2 回答 2

2

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

我认为您正在寻找的是使用立即调用函数实现的模块模式。您的前两个示例都使用立即调用的函数。我相信风格是首选。javascript解析器的周围和原因都期望函数表达式而不是函数声明,这允许尾随调用函数。除了可读性稍差之外,还可能改变函数的返回值。(function(){}());+function(){}();()+()+

我认为您想要对此进行一些更改(从链接复制):

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

    function privateMethod() {
        // ...
    }

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

    return module;
}());
于 2013-02-06T23:37:26.987 回答
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(); }
于 2013-02-06T22:42:22.160 回答