用javascript创建对象(使用新对象)有什么优点



这可能是一个wiki问题,但仍然如此。哪种方法更符合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
    ...
};

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

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

我个人赞成第一种方法,但问题是我是否试图在"错误"的领域应用OO"原则"(请帮助我更好地表达我的问题)。

您的问题实际上似乎与new运算符无关;更多的是关于您应该使用OO还是函数式编程。

在这方面,OO完全在JavaScript的范围内。从API(例如)可以看出,JavaScript是一种非常面向对象的语言。

HTML5更进一步,通过向Object对象添加新方法,让您更好地控制对象。

谈到new的使用,以及是否避免使用,我会给你一个很好的答案(并告诉你使用new)。

我现在的看法是,第二个函数是一个简单的函数,它接受data并发送它生成一个类并将其分解为多个方法是否有利。

因此,取而代之的是:

sendReport(data);

你会做:

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

其中Report有两种内部方法用于验证和编码。这肯定会更容易测试,因为他们会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);

这取决于具体情况,但通常您希望在代码较小时使用第二个,并在代码变大时迁移到第一个。让所有东西都面向对象是没有意义的,但当你有一组作为对象有意义的功能时,那就是你想要创建对象的时候。

当单个函数做得太多时,第二个选项的可测试性会降低。否则,它是非常可测试的,只需改变函数的参数并查看结果。

当您想实例化变量的对象时,可以更多地使用javascript对象,当您可以使用js的原型时,还可以覆盖方法和变量。

我不认为这真的像其他人所建议的那样是关于OO与函数的。

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

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

最新更新