请停止将 JavaScript 类型化(建议不要使用 class 实现类继承)

2015-07-27 11:16:19 +08:00
 ibloging

http://ourjs.com/detail/55b5a17afbd23139de9e354c

6015 次点击
所在节点    程序员
49 条回复
Jex
2015-07-27 12:57:55 +08:00
@otakustay 感谢你的详细测试,我相信其中「多个嵌套函数」一例从原理上来讲是一个Bug,将来会被解决。另外有一个补充,Direct Eval Call 第二个要求是 GetValue的值必须是标准 built-in eval function,但这点JS解释器是无法静态推断的,所以JS解释器GC上认可的只有第一个要求,即名字是 eval的 Call Expression就行了。所以在非Strict ES5下,并不是「非直接eval」(也就是「间接 eval」,Global scope的eval)就一定可以被GC。
otakustay
2015-07-27 13:04:22 +08:00
@Jex 我当时认为“多函数嵌套”下如此粗暴的GC机制是为了整体性能上的衡量,也出于那个时代JavaScript为基础的大型应用/游戏并不流行的前提,现在是怎么样不大清楚了,好久没再测一下了

关于eval那段是没错,或者我这么理解:非严格模式下浏览器基于静态lexical分析对直接eval的判断不特别准,而GC机制并不与eval实际执行时的状态(直接/间接)关联,而是和静态分析关联
21paradox
2015-07-27 13:56:16 +08:00
不知道为啥这么多人讨厌coffeescript
Jex
2015-07-27 14:02:17 +08:00
@otakustay 是的,因为可能同样的代码`eval(code)`这次调用是Direct下次又变成Indirect了,所以原理上解释器无法作普适的优化。
fds
2015-07-27 14:11:10 +08:00
看到文章中说 “CoffeeScript就不一样,它是完全不同的。如果没有学过该语言,它会很难读懂” 就觉得没有继续看下去的必要了。coffee明明只是个语法糖,跟js是直译的。作者这点儿功力就不要阻挡潮流了。
YuJianrong
2015-07-27 14:20:31 +08:00
@tushiner 好吧确实原型继承也是继承。不过JS版的class实现说到底也是建立prototype chain的helper而已,实在感觉不到黑点……
MyLady
2015-07-27 15:00:15 +08:00
爱用用,不爱用就不用又没人强迫你...
如果没人觉得OOP好那Mootools早死了吧
realpg
2015-07-27 15:06:19 +08:00
@yakczh
总有一些JAVA程序员想把他接触过的什么非JAVA的比如JS比如PHP都改成java那样
secondwtq
2015-07-27 15:21:40 +08:00
@learnshare 握爪。

我认为 Coffee 的目的是将 JS Ruby 化,TypeScript 的目的是将 JS C# 化,两者都没有也不可能把这个事情做彻底。

我最近随便看了一个开发 HTML5 游戏的库 Phaser。该库的作者在 13 年 8 月发过一个贴子征集意见:

http://www.html5gamedevs.com/topic/1218-would-any-of-you-care-if-i-dropped-typescript-support-from-phaser/

在 15 年 4 月又发过一个贴子:

http://www.html5gamedevs.com/topic/13599-reconsidering-building-phaser-3-in-typescript/

两个贴子的回复中撕比成分较多,我都没有全部看完,但是可以根据记忆大概说一下内容。

Phaser 貌似原来是使用 TypeScript 构建的,然而随着工程不断展开,遇到了问题。那时候 TS 不很成熟,尤其是工具链,经常出现崩溃之类问题,作者忍无可忍,用 JavaScript 重写了整个库。但是并没有完全放弃 TS,官方依然维护着一套 .d.ts 文件。但是"things don't sit still for long in the web world",现在 TypeScript 越来越成熟,作者在考虑换回去。实际上使用 JS 和使用 TS 都有各自的利弊,这个跑题太远按下不表。但之所以不使用 TS 是因为一些其他的实际问题,比如工具、编译环节、TS 自身的小众、community 贡献的限制甚至 M$ 之前的一贯德行等,确实有许多人承认,TypeScript 是构建游戏的优秀工具。作者说过他虽然不使用 TS 写库了,但是依然会用 TS 写自己的游戏。

TS 还有一个好处,就是向下兼容 JS,并且对 ES6 有支持,这是 CoffeeScript 貌似难以做到的。
learnshare
2015-07-27 15:56:08 +08:00
面向对象、继承 都是编写复杂应用的重要条件,原型、class 的继承方式是两种不同的实现方式而已,没什么优劣。在 ES6 获得广泛支持之前,伪 ES6 的工具还是要编译成 ES5 的原型继承来用。
能烧火的就是好柴,不管是树墩还是牙签。
bramblex
2015-07-27 16:56:59 +08:00
bramblex
2015-07-27 16:59:36 +08:00
要怪就怪自己没本事折腾,别说JavaScript可以折腾出来类继承了,VimScript这种蛋疼货一样可以
wezzard
2015-07-27 19:28:01 +08:00
@secondwtq parser?
anubiskong
2015-07-27 19:44:20 +08:00
"大部分语言发展到一定程度就开始模仿lisp"
忘记谁说的了, 我认为基本是对的, JS应该走自己的路, 学java那套就和PHP当初学java一样最后会变成屎
jiongxiaobu
2015-07-27 21:11:56 +08:00
YuJianrong
2015-07-27 22:43:36 +08:00
@anubiskong 胡说八道。
lisp 永远不可能站上主流地位。
lisp 那样人肉直接写出 AST 不仅不人道而且简直就是浪费计算机的能力……
hitsmaxft
2015-07-27 22:59:30 +08:00
原型链什么的黑魔法不适合连类型继承怎么都不清楚用不好的程序员,大概就是这么回事。
onceyoung
2015-07-27 23:06:30 +08:00
@FrankFang128 现在我们的项目里就模拟了一套class的机制,相当的蛋疼,看着不伦不类
zonghua
2015-07-28 02:22:03 +08:00
递归拷贝实现继承吗?
guotie
2015-07-28 08:55:29 +08:00
es6怎么办

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX