不用class的JS程序员是野生程序员?

2013-02-04 22:01:14 +08:00
 WarWithinMe
前因:我不止一次地被问倒“请用JS写一个类,然后再写一个子类来继承它”。当谈及为什么要写一个类的时候。提问者往往会回答“因为面向对象能够让我们复用代码,多态,应对不同的产品需求,blah blah blah”。然后如果你答不出的话,大概就被认为是个野生程序员,能力底下之类。

但是,在JS里面,为了实现封装、多态的目的,真的只能用“类”这种方式吗?我觉得JS提供的匿名函数、闭包等特性就能够达到代码封装和可扩展的目的。

我怎么就觉得他们认为写代码就是要面向对象,面向对象就是要写类。。。

很想听一下大家的看法。
9570 次点击
所在节点    JavaScript
64 条回复
FrankFang128
2013-02-05 16:24:27 +08:00
明明是面向对象,为什么要面向类呢?
leegorous
2013-02-05 18:05:08 +08:00
曾经我也迷信继承什么的,后来用多了才发现不用那么麻烦,使用组合更好更灵活。而使用组合,也是面向对象的一种方式,路子不必自己越走越窄了。

野生?相对的是什么,饲养的程序员?
kernel1983
2013-02-05 18:11:43 +08:00
CMU取消面向对象课程, 已经是前年的事情了, 搞不懂还有人在执着个啥?

http://developers.slashdot.org/story/11/03/26/0016229/cmu-eliminates-object-oriented-programming-for-freshman
krazy
2013-02-05 19:39:06 +08:00
面试的时候也就这些好问了吧..
闭包是什么?怎么实现继承?用过jquery没?

有些书上,是把类式继承比原型式继承更适合其他程序员理解当作优点的..
WarWithinMe
2013-02-05 20:25:27 +08:00
@yun77op 可维护性这种东西比较主观。但我觉得很多情况不同方法应该都有差不多的可维护性。其实我本意不是说JS不要写Class什么的。而是觉得过分强调只有类才能"拯救世界"是不是有点太过盲目了。
iwege
2013-02-05 20:54:35 +08:00
一般不是过分强调类,因为现在这种类oo的开发方式多起来了,所以才需要对方了解这个东西,不然不好介入实际的开发。如果对方的开发当中有用到这个玩意,你不理解,他就知道这个项目当中你可以操作的部分有哪些。

其实这里最关键,能理解原型继承就ok了。如果应聘者不理解,但是OO是自己项目当中又是一块核心,招募进来就需要自己教育了。


继承这块也算是JS的基础知识了,问两句没什么的。至于说要不要写Class,还是要看场景,一般来说就算不写Class,也会用类似的方式实现。



另外关于野生:JS哪里有非野生的?哪个学校现在教JS?
WarWithinMe
2013-02-16 15:31:50 +08:00
@iwege 其实是他们的leader后来问我有没有考虑过如何做大规模的软件开发。。。。。其实言下之意是觉得这样不用Class的程序员很野生,只会写一些小应用。。。但其实每种语言有他自己的写法,不代表不理解OO和代码维护什么的。。。。所以我觉得他们的思维太过狭窄了。
RisingV
2013-02-17 13:02:34 +08:00
Javascript语言实际上是两种语言风格的混合产物(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(js原作者)(函数式编程)与网景公司(面向对象编程)共同决定的。

所以不必纠结是class还是function,它本身就不纯粹
RisingV
2013-02-17 13:05:18 +08:00
@kernel1983 有没有看清楚啊?是取消大一的面向对象课程(本身过早接触就不合适),大二再上。毕竟面向过程是面向对象基础
RisingV
2013-02-17 13:09:59 +08:00
@WarWithinMe 这话说对了,语言有自己的写法,把自己熟悉的语言的思维方式迁移到自己可能陌生的语言这种做法太狭隘。而且诞生比较早的语言本身,也受到芯片性能瓶颈和编程语言理论发展程度的限制
RisingV
2013-02-17 13:14:55 +08:00
@leegorous 没错,组合(聚合)+duck typing也是OO的一种良好实现(Go就是这么做的),没有人说过继承是OO的绝对内涵
heroicYang
2013-02-17 13:51:29 +08:00
噢...又浮起来了...这个得看具体的应用场景!
reusFork
2013-02-17 13:53:46 +08:00
复用代码不一定要用到面向对象,用面向对象不一定要用到类,用类也不一定要用到继承
对js这种弱类型语言来说,多态这个概念根本不需要引入,因为不做静态类型检查

野生动物的生存能力显然比驯化了的要强,所以用野生来形容能力低下不适当
chunshuai
2013-02-17 16:24:50 +08:00
野生不野生 无所谓。 JS 关键是 得闭包
arkilis
2013-02-17 17:11:06 +08:00
为了对象而对象,这样合适吗?
jiyinyiyong
2013-02-17 23:49:26 +08:00
野生.. 后来终于接触到 OOP 相关内容时那个难懂,
想了很多天, 最后觉得 `this` 和 `__proto__` 组合基本上 `class` 不用么
结果就想不通, 纠结了又好几天, 还在网上问啊
http://stackoverflow.com/questions/14019655/how-about-simulating-objects-with-javascript-objectsrather-than-constructors
请教过一个学长, 他在学校精通 C++ C# Java, 面向对象头头是道
从 JS 入门, 跟人家真是没法比了
supersheep
2013-02-18 10:20:39 +08:00
野生好味。
dreampuf
2013-02-18 11:06:32 +08:00
我觉得他们是想让你的程序更加抽象,易维护。
OO只是一种手段,上面各位执着Class才能OO的童鞋,你让那些写C的大叔情何以堪。

OO提供的抽象多态封装继承无非都是为了解决软件工程规模的问题,他们都只是总结良好的经验,但是条条大路通罗马,非得限制哪一条就是自己死板。
GreatHan
2013-02-18 11:48:35 +08:00
组合比继承要好
gouflv
2013-02-18 13:04:03 +08:00
目前coffee是最简单的实现方法
有些时候 jq的写法确实不利于维护, 而很多jq插件的内部其实也是new Class

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

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

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

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

© 2021 V2EX