在javascript中创建对象(使用new)有什么好处?

时间:2012-07-18 09:17:45

标签: javascript functional-programming functional-testing

这可能是一个维基问题,但仍然存在。哪种方法更符合Javascript精神:

var Report = function(data) {
    var that = this;
    that.send = function() { ... };
};

var r = new Report(data); // create and validate the data
r.send(); // encode and send the data

var sendReport = function(data) {
    ...
    // create, validate, encode and send the data
    ...
};

第一种方法似乎更多是OO,第二种方法更具功能性?在第一个中,似乎Report的函数更可测试(尽管例如我们在此阶段只有send())。另外,我希望在需要检查状态时在调试器中看到类型为Report的对象。

第二种方法可能更“简单”,但似乎不太可测试。

我个人采用第一种方法,但问题是我是否尝试在“错误”域中应用OO“原则”(请帮助我更好地说出我的问题)。

5 个答案:

答案 0 :(得分:1)

您的问题实际上似乎与new运营商无关;它更多的是关于你是否应该使用OO或函数式编程。

在这方面,OO完全范围内。您可以从API(e.g. e.g.)看到JavaScript是一种面向对象的语言。

HTML5通过向Object对象添加new methods,让您更好地控制对象。

触及new的使用,以及是否避免使用,我会指向this excellent answer(并告诉您使用new)。

答案 1 :(得分:1)

我现在看到的方式是,第二个是一个简单的函数,它需要data并发送它。你在想 是否有利于制作一类并将其分解为多种方法。

所以不要这样:

sendReport(data);

你会这样做:

var a = new Report(data);
a.send();

Report有2个内部验证和编码方法。它们肯定会更加可测试 3个不同的功能,而不是一个只能在一个批次中完成的功能。

性能无需考虑,它是2个额外的函数调用和1个额外的对象创建。您可能不会每秒发送数百万次报告。特别 因为它意味着网络I / O.

也没有什么要求你构建一个新实例,你也可以这样做:

var report = {
    encode: function(){},
    validate: function(){},
    send: function( data ) {
        if( this.validate( data ) ) {
            data = this.encode(data);
        }
        else {
             //?
        }

        //send
    }
}

然后,您无需构建新实例即可获得上述优势:

report.send(data);

答案 2 :(得分:0)

这取决于,但一般来说,当你的代码很小时,你想要使用第二个,并随着它变大而迁移到第一个。使一切都面向对象没有意义,但是当你拥有作为对象有意义的功能组时,那就是你想要制作对象的时候。

当单个函数执行太多时,您的第二个选项只是不太可测试。否则它是非常可测试的,只需通过改变函数的参数并查看结果即可。

答案 3 :(得分:0)

当你想要实例化变量的对象时,使用javascript对象可以更好地工作,当你可以使用js的原型并且还允许你覆盖方法和变量时。

答案 4 :(得分:0)

我认为这不是关于OO与功能的关系,正如其他人所建议的那样。

真正的问题是报告本身是否是一种有用的抽象。如果是 - 也就是说,如果你想对它执行其他操作而不是立即发送它 - 那么实现它的抽象是有用的。在OO中,这将是一个类或等价物(在JS中,构造函数)。在函数式语言中,通常在这种情况下引入模块或抽象数据类型。

如果您不需要抽象,只需使用一个过程/函数。