JavaScript:为什么有些函数不是方法?

时间:2017-01-21 10:15:47

标签: javascript function methods

我曾经被学生问过为什么写作:

  • parseInt(something)
  • something.toLowerCase()

也就是说,为什么将变量作为参数,而将另一个变量应用于变量。

我解释说虽然toLowerCase是字符串对象的方法,但parseInt并非如此设计。好的,所以它是window.parseInt,但这只是使它成为一个不同对象的方法。

但它让我感到不稳定 - 为什么某些字符串或其他函数不是它们相应对象的方法?

问题是为什么?有parseInt和其他函数不是方法的技术原因,还是只是一个历史怪癖?

3 个答案:

答案 0 :(得分:3)

一般来说,Javascript的设计很匆忙,因此质疑每个设计决策并不总能充分利用您的时间。

话虽如此,特别是parseInt,其原因很容易解释:它几乎可以接受任意类型,例如:

parseInt(undefined)  // NaN

由于您无法实现undefined.parseInt(),唯一的方法是将其实现为静态函数。

从ECMAScript 2015开始,parseInt已在Number.parseInt中进行了镜像,可以说它比window更有意义。为了向后兼容,window.parseInt仍然存在。

答案 1 :(得分:2)

在这种特定情况下,它对封装有意义。

考虑parseInt() - 它从未知位置获取未知类型的值并从中提取整数值。你打算用哪种方法来制作它?他们都是?

String.toUpperCase()应该只接受一个字符串作为输入(否则可以将其转换为字符串)并返回一个字符串。这很好地封装在一小部分案例中,由于值不是强类型的,因此将其作为全局函数似乎是合乎逻辑的。

至于JavaScript的其余部分我不知道也不了解它以这种方式完成的真正原因,但对于这些具体的例子,我认为这是一个合理的设计决策。

答案 2 :(得分:0)

近年来,JavaScript语言的开发进展非常快。考虑到这一点,由于向后兼容性,许多事情仍在API中 - 正如您所说的历史原因。虽然我不能说这是唯一的原因。

在JavaScript中,您不仅可以使用Object oriented范例(对象的方法通常共享公共状态)来解决问题。另一种functional方法可以很容易地应用,而不会在JavaScript语言中遇到太多麻烦。

JavaScript为用户提供了很大的力量,可以解决问题。有句话说:“有了强大的力量,就有了很大的责任感。”