有很多文章和帖子解释了 JavaScript 继承是如何工作的,但是为什么 JavaScript 使用原型继承而不是经典继承来实现呢?
我喜欢 JavaScript,所以我并不是说它是坏事……我只是好奇。
有很多文章和帖子解释了 JavaScript 继承是如何工作的,但是为什么 JavaScript 使用原型继承而不是经典继承来实现呢?
我喜欢 JavaScript,所以我并不是说它是坏事……我只是好奇。
以下是 Brendan Eich 对所发生事情的看法: https ://brendaneich.com/2008/04/popularity/
正如我经常说的那样,正如 Netscape 的其他人所证实的那样,我被招募到 Netscape 的承诺是在浏览器中“执行 Scheme”。至少包括 Tom Paquin、Michael Toy 和 Rick Schell 在内的客户工程管理人员以及一些名叫 Marc Andreessen 的人都确信 Netscape 应该在 HTML 中嵌入一种源代码形式的编程语言。
高层工程管理部门的命令是该语言必须“看起来像 Java”。这排除了 Perl、Python 和 Tcl 以及 Scheme。
我并不骄傲,但我很高兴我选择了类似于 Scheme 的一流函数和 Self-ish(尽管是奇异的)原型作为主要成分。Java 的影响,尤其是 y2k 日期错误以及原始与对象的区别(例如,字符串与字符串)是不幸的。
JavaScript 最初应该与 Lisp 非常相似。即使在语法更改为更接近 C/Java 之后,它仍然是 C 外衣的 Lisp。我认为答案在于它的函数式编程起源。在纯 FP 中,没有可变状态,这意味着没有可变对象。如果你稍微放宽规则并稍微有创意,你最终会得到类似原型继承的东西,即你可以扩展对象但不能修改原始对象。它提供与继承相同的功能,并且仍然为您提供一些不变性。
最后,扭转语言,让它看起来像 C++ 和 Java,还有中提琴,你有new someFunction()
,剩下的就是历史了。
因为它深受自我的影响。维基百科和 ECMA 规范都提到了这一点。
我认为选择它是因为它易于实现,不需要额外的关键字,并且用户不需要理解它就可以使用该语言。它也比基于类的继承更强大和灵活。
这是无类型语言的自然选择。基于类的继承的主要优点是它允许静态类型,从而允许类型检查和更快的基于表的查找实现。
原型继承(带有闭包)允许其他人做从未设想过的事情。它是几种范式的结合,它们结合在一起以实现通用编程。
使用原型语言,您可以为您的类添加“混合”。您可以实现所需的封装级别,而无需特定语言的关键字。简而言之,原型语言很棒。
我不想这么说,但是 JavaScript 和一些库可以完成我需要它做的一切。它的发展是颠覆性的(应该是从属于 Java 的)。在最简单的实现中,它具有很大的功能。
通过足够的学习/玩耍,您将开始看到它的灵感的优势。JavaScript 是少数有意“隐藏”其潜力的语言之一。如果你想知道“为什么”,就必须涉足政治。但是,正因为如此,它很棒。