对,就像你看到的一样,JavaScript 和 Java 之间有过不堪回首的基情。当时的设计者 Michael Scofield 失散多年的哥哥 Brendan Eich 不惧 Sun 公司的威逼,坚决不将 OOP 引入 JavaScript;但是在 Sun 公司的利诱下艰难的把 new 命令引入到了 JavaScript中。
new,中看不中用
由于 Sun 公司不够意思,所以 Big Fish 也只是意思意思。在 JavaScript 中,new 后面跟的根本就不是类,只是构造函数而已(毛用没得,完全不能继承啊)。当你 new 一个类的时候,该类的实例会自动生成一个 constructor 属性,指向你定义的构造函数。所以呢,继承呢?对,这只是构造……
1
2
3
4
5
6
7
8
Language (name) ->
@name = name
js = new Language("javascript")
java = new Language("java")
console.info(js.constructor is Language) //true
console.info(java.constructor instanceof Language) //true
prototype 出现了
Sun 公司发现被坑了后,非常气愤。立马对 Brendan Eich 进行了各种糖衣炮弹的合理围攻,终于使我们威武雄壮的 Scofield 的哥哥再一次做出了一个艰难的决定:给所有 JavaScript 类(不是实例),增加一个类。