1995年,Brendan Eich被Netscape公司聘请,并要求为他们的HTML浏览器创建一种语言。传言说,他在10天内设计了摩卡,后来改名为LiveScript,然后变成JavaScript。最初计划使其类似于Scheme,一种LISP语法的语言。但为了取悦C++/Java编程人员,它在语法上被设计得与Java相似。2008年,Brendan犯了个悲剧性的错误:他为支持加利福尼亚反同性婚姻法律捐出了1000美元。2014年,他加入了Mozilla担任CEO,人们记得他的反多样性举动。他不得不辞职,然后创立了Brave Software,开发了Brave浏览器。大约在那个时候,他们开始淘汰JavaScript。由于最近的ECMAScript更新和TypeScript,它仍然发挥着很好的作用。
在30年前创建的JavaScript中,对象是原始的关联数组属性。数据、函数或另一个对象可以附加到对象的属性上。让我们看看Brendan在2008年对JS的说法。
一流函数意味着可以将函数用作可分配给变量的值。然后他得出结论(请注意,这是C而不是C++):
Self,他在几次提到的是一个由David Ungar和Randall Smith设计的原型对象导向的面向对象语言,最初在Xerox PARC,然后在斯坦福大学,最后在Sun Microsystems开发。Self没有类,不像Java或C++。相反,它只有对象。在Self中创建一个新对象,我们复制一个现有对象(原型)然后修改一些其槽(属性)。
在Self中,对象没有类型:所有方法调用都在运行时分派。例如,我们要求一本书重新命名自己:
rename是我们使用单个字符串参数调用的book的方法。计算机在调用rename方法之前对book一无所知。显然,这种鸭子类型有其性能缺陷。每次调用rename都会在book的虚拟表中进行搜索。相反,在C++中,类型在编译时已知,可以立即调度rename()。
类型(在C++中是类,在Java中是接口)和类型注释对编译器是有帮助的。但对我们人类来说是负担。它们要求我们做编译器的工作。我们必须用这样的消息来污染我们的代码:“这个对象b是Book类型,请记住。”编译器必须足够聪明,能够在没有我们的提示的情况下理解它。
尽管这是一个有争议的话题。一些人认为类型注释有助于程序员更好地理解代码并减少错误。我也赞成减少错误,但更希望编译器能够自动推断类型,而无需我的注释。如果我执行b.rename(),而b被认为是一辆汽车而不是一本书,我希望编译器能够自行发现这一点并拒绝编译。
无论如何,JavaScript被设计为一种基于原型的动态类型语言,具有类似Java的简洁语法。直到业界决定“修复”它之前,它一直运行良好。
2008年,Mozilla和其他人提出了ECMAScript 4,其中包括类、模块和其他功能。Microsoft采取了极端立场,拒绝接受ES4的任何部分。Microsoft的Internet Explorer平台架构师Chris Wilson批评ES4试图引入过多变化。Brendan Eich指责Wilson在传播虚假信息和玩政治游戏。ES4被放弃,类被删除。
然后,2012年,Microsoft创建了TypeScript,一种带有类型注释和类的JavaScript。由于类不在标准中,Microsoft自己创建了类。
最后,2015年,ECMAScript 6将类(以及其他功能)添加到JavaScript规范中。许多ES4功能,包括类,以“最大限度地最小化”的形式复活。Java/C++开发人员群体得到了他们想要的东西。
让我们听听JavaScript的推崇者之一Douglas Crockford在2014年说的话。
很不幸,不再是这样了。看起来最近版本的JS开发者相信其他东西。或者他们不再想为人类做出贡献。也许他们只是想让人们开心。
类型注解和类与JavaScript的无类对象编程概念不匹配。它们来自Java或C ++,但不适用。一些程序员可能会发现它们有帮助,但只是因为他们习惯在其他语言中看到它们。尽管名称看起来相似,JavaScript并不是Java。
Java具有类、实现继承和静态方法,是给“蠢蛋”设计的面向对象编程。根据Douglas Crockford的说法,这是为那些不知道什么是面向对象编程的人设计的。另一方面,JavaScript是概念上坚实的OO语言之一,如Smalltalk和Self。将Java的特性融入JavaScript只会破坏后者的风味。
看到一个曾经严格以对象为中心的语言范式变成多样化、无法匹配和次优的特性是令人悲伤的。
附言:如果忽略类和类型注解,JavaScript仍然是一种很棒的语言。当我用JavaScript写作时,我不使用它们。看看我在yegor256/jo存储库中的代码。它展示了我的《初级对象》一书。我为这段代码感到自豪。
Translated by ChatGPT gpt-3.5-turbo/42 on 2025-12-28 at 12:46
