对象字面量与函数

Object Literals vs. Functions

我找不到以下问题的答案。

我最担心的是启动一个在大多数环境(主要是浏览器)上不受支持的项目。我发现您可以用两种不同的方式编写模块:函数或对象文字。

对象文字

var foo = {
    bar: function(){}
}

函数表达式

var foo = function(){
    var bar = function (){};
    return{
        method: bar
    }
}

第二个选项具有创建私有成员的能力,据我所知,第一个选项没有。我查到的资料也说第一个选项是一个对象,而第二个选项是一个函数表达式。

对 JS 半陌生,所以我可能会遇到一些问题。除了能够使内部成员私有之外,在表示法上还有其他区别吗?据我所知,两者都能够遵循模块、观察者、单例模式。我发现的唯一区别是原型设计模式。

有几个术语需要知道。首先因为它涉及到功能:

Function Declaration:

function foo(){

}

匿名函数声明:

function(){

}

Function Expression(函数赋值给一个变量):

var foo = function(){

}

Immediately Invoked Function Expression(第一组括号把匿名函数声明变成表达式):

(function(){

})();

现在,除了功能之外,您还询问 Object Literal:

var foo = {
    bar: function(){}
}

对比函数表达式:

var foo = function(){
    var bar = function (){};
    return{
        method: bar
    }
}

甚至函数声明:

function foo(){
    var bar = function (){};
    return{
        method: bar
    }
}

关于函数语法能够创建私有成员的说法是正确的,而对象文字没有这种能力(它只是分组 keys/values 的一种方式)。但是,另一个重要的区别是函数可以用作构造函数 (var f = new foo()) 并且可以有 Prototypes,而对象文字不能。因此,在设置继承模式时,函数通常更加通用。