【问题标题】:Difference between JavaScript methods structureJavaScript方法结构之间的区别
【发布时间】:2013-08-07 12:49:04
【问题描述】:

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

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,但是在什么情况下我应该使用它们呢?

【问题讨论】:

    标签: javascript oop object methods


    【解决方案1】:

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

    一个更实际的例子,考虑这个页面。有多个Posts,每个都有自己的状态(他们有什么Comments,他们有什么文本,他们当前是否正在编辑等等)。如果您只是做了var post =,那么这意味着只能有一个帖子。我怀疑您可能会使用一些临时 jQuery 来操作该单例中的多个帖子,但是无论如何您都没有对问题进行面向对象的建模。


    第二个是构造函数使用不正确,创建的对象不会是Obj2的实例,而是Object的实例。您将使用如下构造函数:

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

    返回对象字面量在构造函数中起作用的原因是构造函数 允许返回任何类型的对象。但是做一个构造函数是没有意义的 只返回Objects。

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

    【讨论】:

    • 第二个可能是某种形式的模块模式?当然,在这种情况下不必使用new 调用它。
    • @FelixKling 在模块模式中,您会立即调用它,因为要求客户端无缘无故调用函数是没有意义的。您应该可以只使用 var module = require("module"); 而不是 var module = require("module")();
    • 我明白了。我从来没有真正使用过它,所以它在我眼里看起来很相似:)
    【解决方案2】:

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

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

    【讨论】:

    • 当您想要构建一个 Object 时,通常会编写这样的函数。大写字母和new 确实建议用作构造函数,但是(此示例)如果作为普通函数调用,则其工作方式相同
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    相关资源
    最近更新 更多