Prototype构造函数上下文中的JavaScript类型检查和异常?

时间:2015-12-09 23:39:03

标签: javascript class oop prototype

我构建了我的第一个开源JavaScript库作为节点模块,它解决了一个非常简单的问题,因此它是一个非常简单的模块,具体来说,它是一个单一的原型对象

为了提供背景,我来自纯粹的网络技术背景,仅在过去的一年里,我开始研究其他语言,爱上了静态类型,真正的OOP和面向类的语言,我和#39;我开始看到营地两边语言的利弊范围。

据我所知,在构建面向类的时,您应该return nil指定构造失败,允许用户与if(instance === nil)核对#39;成功。或者,我已经看到return 421例如提供错误代码,我还假设一些也返回字符串e.t.c. 但重要的是,我已经看到你不应该抛出异常。

这是对的吗?还有什么原因呢?对于面向原型的语言来说,这也是一个问题,或者javascript的动态特性是否可以接受?

这引出了我的下一个问题,多年来我看过很多javascript库,有一些修补程序和诸如此类的东西。我发现不仅罕见的是以OOP-ish模式构建原型,而且很少遇到任何经常实现的类型检测或类型检查,很多人都依赖于动态类型的便利性提高了生产力,但我想通过动态类型开始混淆每种类型系统的优点和缺点,但也使用一些静态类型的模式和方法引入更稳定的架构。 为了达到这一点,重要的是检查javascript脚本是否可以接受(甚至是好的?)做法?我想在我的原型构造函数和方法中添加严格的类型检查代码,但由于它是一个开源项目,我担心社区将如何处理它,他们是否希望它更加动态地输入?我只能假设很多人使用动态类型语言... ...动态打字,但值得深思。

声明了解 已经看过很多人说javascript是"无类型"而不是"动态"打字,但纯粹使用动态扩散。

TLDR-Q1:我可以在构造函数方法中抛出异常吗?在javascript原型中怎么样?为什么!?我该怎么处理呢?

TLDR-Q2:我可以引入重型检查并抛出异常,以便为javascript脚本提供一个糟糕的静态类型吗?开发人员喜欢这样吗?我是无知的,这是一个非常普遍的事情吗?

1 个答案:

答案 0 :(得分:5)

  

TLDR-Q1:我可以在构造函数方法中抛出异常吗?怎么样?   javascript原型?为什么!?我该怎么处理呢?

是的,您可以在构造函数中抛出异常。如果传递了真正无效的参数,那么这可能是最干净的方法。

我自己通常不会设计一个预期的代码路径来抛出异常,而是将其保留为可能表示错误数据或程序员错误使用的错误类型。在调试控制台中,异常会被很好地记录下来,并且是使用构造函数与他人进行通信的最快捷方式之一,因为它会被记录,并且您可以在错误对象中添加一条很好的描述性消息。你抛出,开发人员得到一个堆栈跟踪。

返回null并不是一种干净或有用的方式,并且添加了开发人员通常无需一直检查null的代码。

  

TLDR-Q2:我可以引入重型检查并抛出异常   给javascript脚本一个穷人的静态类型?开发人员喜欢   这个?我是无知的,这是一个非常普遍的事情吗?

您可以根据需要编写Javascript类型检查。 IMO,你应该只在你试图确定传入的参数是否有效时才这样做。如果你需要一个字符串并且开发人员传入一个数字并且数字字符串是该函数的合理输入,那么我不明白为什么你不应该只是自动使用Javascript的字符串转换并放手。

Javascript开发人员喜欢键入检查,以帮助他们识别他们所犯的错误。 Javascript开发人员不喜欢在它只是迂腐时进行类型检查,并且自动或显式类型转换可以正常工作。

另外请记住,您应该很少坚持传递的对象是特定类型的对象(比如使用instanceof),因为传递任何与预期对象一样的对象应该是完全有效的。例如,Javascript中的promise几乎可以是具有遵循正确规范的所需方法的任何对象。它不必是具有一个特定构造函数的特定类型的对象类。

Javascript不是一种强类型语言,并且没有理由让它表现得像它不是它的行为。检查类型是否正确运行代码所需的时间,而不是因为您尝试使Javascript的行为与Java一样严格。我不建议添加类型检查只是因为您认为所有语言都应该进行类型检查。如果这是您的思路,那么也许您应该使用TypeScript或类似的东西来编写,以便为该语言添加类型规范。