2013-08-07 71 views
0

此方法结构/调用之间有什么区别?
我经常看到不同的方法结构,我不明白每个方法的好处。JavaScript方法之间的差异结构

var obj = { 
    some_method: function(){ 
     return 'This works'; 
    } 
} 

var Obj2 = function(){ 
    return { 
     some_method: function(){ 
      return 'This works too'; 
     } 
    } 
} 

console.log(obj.some_method()); 

var obj3 = new Obj2(); 
console.log(obj3.some_method()); 

它们都返回他们应该,这里的JsFiddle,但在什么情况下,我应该用他们每个人的?

回答

1

第一个类似于singleton,I.E.你不能拥有多个相同类型但具有不同状态的对象。就像它只能在你的整个应用程序中有一个实际的动物而不是很多。

更实际的例子,请考虑这个页面。有多个Post s,每个都有自己的状态(他们有什么Comment,他们有什么文本,他们正在编辑等等)。如果你只是做了var post =那么这意味着只能有一个职位。我怀疑你可能会有一些专门的jQuery来操作该单例中的多个帖子,但是你不会对该问题进行面向对象的建模。


第二个被不正确地使用构造函数,则创建的对象不会是Obj2Object实例。你可以使用一个构造函数,如:

function Obj2() { 
    //initialize fields here 
} 

Obj2.prototype.someMethod = function(arg) { 
    return this.state + arg; 
}; 

原因返回对象文学作品中一个构造函数是一个构造 被允许返回任何类型的对象。但是,仅使构造函数 仅返回Object s是没有意义的。

通常需要Object唯一用于分组相关静态功能组合在一起(行为,但没有延长的数据) 或作为字典/地图/缔合阵列(数据但没有行为)。

+0

第二个是某种形式的模块模式可能吗?当然,在这种情况下,它不一定要用'new'来调用。 –

+0

@FelixKling在模块模式中,您可以立即调用它,因为要求客户端无需调用某个函数是没有意义的。你应该能够'var module = require(“module”);'而不是'var module = require(“module”)();' – Esailija

+0

我明白了。我从来没有真正使用它,所以它只是在我的眼睛看起来类似:) –

0

在第一个代码中,您打电话给obj.some_method()some_method是一个函数,嵌套为obj的属性。这种模式是命名空间的一种方式。

在第二种情况下,您正在创建一个对象,使用Obj2作为构造函数。但是,不是返回Obj2的实例,而是返回了与前一个示例的obj具有相同结构的对象。这会给instanceof测试带来错误的结果,因为new Obj2应该返回自己的一个实例,而您的代码并没有这样做。

+0

写这样的功能通常是当你想建立一个_Object_。大写字母和'new'确实表明用作构造函数,但是(这个例子)如果作为普通函数调用,它的作用是相同的 –