2012-07-18 49 views
2

这可能是一个wiki问题,但仍然如此。哪种方法更加符合JavaScript的精神:在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“原则”(请帮助我更好地说出我的问题)。

+0

OO原则与“新”操作符无关。我用你的第二个见解来开发我所有的课程。 – 2012-07-18 09:37:45

+0

@some_coder我看到它的方式,第二个是一个简单的函数,而不是一个类。它需要数据并发送,然后完成。 – Esailija 2012-07-18 09:39:09

+0

@Ssailija在JS中,你真的没有像其他语言(如C++/java)中的“类”。第一种方法也仅仅是一个函数(你可以看到它是一个函数指针或左右)。唯一的区别是你使用“var x = new Report(data)”创建一个实例。在第二种方法中,您只使用“var x = sendReport(data)”来创建一个实例。或者我不明白这个问题。 – 2012-07-18 09:42:32

回答

1

您的问题实际上并不是关于new运算符;它更多的是关于你是否应该使用OO或者函数式编程。

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

HTML5进一步考虑了这一点,并且通过将new methods添加到Object对象中,您可以更好地控制对象。

接触使用new,以及是否避免它,我会指出this excellent answer(并告诉你使用new)。

+0

仔细看,这个问题在我看来更多的是关于“我做一个类还是只是一个函数这一切“,这不是真的关于JavaScript。我可以用任何语言制作神功能。 – Esailija 2012-07-18 09:31:54

+0

@Esailija:我不确定它是否是? *问题是如果我尝试在“错误”域中应用OO“原则”* – Matt 2012-07-18 09:33:23

+0

我们通过代码审查进行了大量辩论,因此它是关于“正确的”编程方法,我正在尝试编写C++/Java在Javascript中?我在使用还是滥用语言 - 这就是问题所在。再次,希望措辞是对的。 PS:@Esailija:我确实发现你的(已删除的)答案非常有帮助和教育性。 – BreakPhreak 2012-07-18 09:35:35

0

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

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

0

它是当你想实例化变量的对象,更多的JavaScript对象,当你可以使用js的原型,也允许你重写方法和变量。

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); 
0

正如其他人所建议的,我认为这不是关于面向对象的功能。

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

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

相关问题