JavaScript方法结构的区别

时间:2013-08-07 12:49:05

标签: javascript oop object methods

此方法结构/调用之间有什么区别?
我经常看到不同的方法结构,我无法理解每种方法的好处。

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,但在什么情况下我应该使用他们中的每一个?

2 个答案:

答案 0 :(得分:1)

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

更实际的例子,请考虑此页面。有多个Post,每个都有自己的状态(它们有Comment,它们有什么文本,当前是否正在编辑等等。如果您刚刚var post =,那意味着只能有一个帖子。我怀疑你可能会有一些特殊的jQuery来操作那个单例中的多个帖子,但是你还是没有对这个问题进行面向对象的建模。


第二个是错误地使用构造函数,创建的对象不是Obj2Object的实例。您将使用如下构造函数:

function Obj2() {
   //initialize fields here
}

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

返回对象文字在构造函数中工作的原因是构造函数 允许返回任何类型的对象。但是构建一个构造函数是没有意义的 只返回Object s。

您通常只需要Object来将相关的静态功能组合在一起(行为,但没有延长的数据) 或者作为字典/地图/关联数组(数据但没有行为)。

答案 1 :(得分:0)

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

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