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

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

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

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

很想听一下大家的看法。
9570 次点击
所在节点    JavaScript
64 条回复
DrWeb
2013-02-05 11:04:07 +08:00
@aisk 干吗呀,说得不对你就指出来呗,这么鄙视我干什么
DrWeb
2013-02-05 11:05:06 +08:00
@zhangxiujiao 你还是直接说错在哪吧
willerce
2013-02-05 11:23:33 +08:00
@zhangxiujiao @aisk 请问二位大神,@DrWeb 说的错在哪?面向对象,封装、继承、多态。ECMA Script 有定义这些实现方法么?
zythum
2013-02-05 11:24:59 +08:00
@zhangxiujiao
@aisk

@DrWeb 说的是没有错的。除了"Javascript本身并不支持面向对象", 因为Javascript本身什么都是对象。但是是prototype继承,并没有java那么好的继承逻辑。所有的规定都需要人去遵守,并不是强制,那么虚函数和super都是各种的问题和漏洞。现在没有一个框架的super是完美的。

设计模式什么的看看是没错,但是不能所有的东西都套着设计模式来。可以写个数据类,写个简单的所谓的基类使得代码可读。但是不要过度得这么玩。会死很惨。就像我现在维护的前人的代码一样。
liudao
2013-02-05 11:27:14 +08:00
DrWeb
2013-02-05 11:27:15 +08:00
@zhangxiujiao
@aisk
js语法中确实没有类这个说法,你们想表达什么
WarWithinMe
2013-02-05 11:30:43 +08:00
@davidx 当时说我平常用的jquery。。。然后是无尽的鄙视。。.
@zythum 我觉得前端的代码并不像其他程序一样需要复杂的结构,也觉得has-a要比is-a反而要好一些。
zythum
2013-02-05 11:41:58 +08:00
@WarWithinMe os也是has-a的思想。同样也能写复杂的结构。现在js也是越来越复杂了。今年各种个样的mvc都出现了。都没时间看。瞬间感到落伍了有木有。复杂并不可怕,主要是代码的可读,可维护很重好。朱一在这方面一直做的不好。在慢慢改进中。
sivacohan
2013-02-05 11:49:36 +08:00
"因为面向对象能够让我们复用代码,多态,应对不同的产品需求,blah blah blah”
尼玛,说的好像函数就不能复用,回调函数就不能多态了一样……
WarWithinMe
2013-02-05 11:52:57 +08:00
@zythum 我意思是你用has-a的思想的话,就不用建立一整套很复杂的类结构。。。不然的话,你要想弄明白这个结构的话你得去看整个类结构。MVC是为了那种像gmail这样的web app而设的吧。。。但是像gmail这样的web app又有多少呢。。。国内的前端不就是给各种连接,各种按钮,各种输入框加入些功能而已嘛。。
zythum
2013-02-05 12:30:02 +08:00
@WarWithinMe 其实微博的构架已经近似app了。基本不刷页的。只有在不用产品线之间做跳页。因为开发的团队不一样。

类结构可以不复杂。可以简单的做一些规范。便于阅读。不要一层套一层就可以了。
luikore
2013-02-05 12:52:27 +08:00
写 class 的都是不懂 js 的半吊子
用 class 的还要折腾元对象协议才能有 prototype 一半功能...
aisk
2013-02-05 13:14:59 +08:00
@zythum @DrWeb @willerce
我来说@DrWeb 的错误
访问控制符一向都不是面向对象必须的,Python基本上就处于没有的状态(除了那个“__”,不过也是不提倡使用的,而且也并不能真正隐藏属性)。虚函数这个概念对于有鸭子类型的动态语言就更没什么意义,js里要真有虚函数真是搞笑了。js用原型继承,当然用不到extends一类的关键词,原型继承和类似模板的类继承只是两个不同的思路。
cyberscorpio
2013-02-05 13:51:20 +08:00
程序员要:
以野生为荣,以家养为耻。


楼下继续。。。
zhangxiujiao
2013-02-05 14:07:52 +08:00
这个问题就不要争了,你们让我想起了那句经典的台词——php是世界上最美的语言。javascript到底是不是面向对象的,JavaScript.The.Definitive.Guide里解释的很详细,没看过的建议去翻翻。另外,理解面向对象不要用java,c#的规则去生搬硬套。
davidx
2013-02-05 14:29:04 +08:00
@WarWithinMe 你也鄙视他吧, 一顿胡吹...
clowwindy
2013-02-05 14:54:07 +08:00
一般说到 js 的“类”,指的都是用 Cat.create 模拟类方法,Cat.prototype.walk = function(){...} 模拟实例方法, Cat.prototype = new Animal() 来模拟继承的写法。
你可以说你用了“类”,也可以说你用了 prototype。这只是说法的问题。

不管它叫什么,如果不用这种写法,你不大容易写出一个可以复用的组件,比方说一个数据表格,或者一个下拉菜单,或者一个可以随处摆的 like 按钮,使你的 ***下游用户*** 能仅仅通过创建一个你的对象出来,通过匿名函数、闭包等特性传入回调,调用对象上的方法,就能轻松使用你写的组件。(还记得你是怎么使用 jQuery 的吗?)
DrWeb
2013-02-05 14:58:42 +08:00
原来@别人要消耗那个什么金钱,-_-!,那我不@了。

首先,javascript是不是面向对象,这个要看语境,我观楼主的意思,那肯定就是说主流java、c#之流的面向对象,我打赌楼主自己应该也是这意思,所以我是在传统面向对象的环境下说“并不是一个完全的面向对象的语言”,以及提到了一些普通意义上的面向对象的相关东西。

两位大神一下就看到了“JS不是面向对象”,好吧,我承认我等是野生程序员,看书自学的,比不得二位一代宗师,已达到了“手中无剑,心中有剑”的至高境界,一切皆对象。这个可以有,我也说了可以某些方法实现。不巧二位传奇驾临我们这小位面,我等讨论的境界低了,惭愧、惭愧!

至于JavaScript是不是面向对象,这得看怎么说,细一点讲,Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。
这是由Brendan Eich的设计思路决定的:

 (1)借鉴C语言的基本语法;

 (2)借鉴Java语言的数据类型和内存管理;

 (3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;

 (4)借鉴Self语言,使用基于原型(prototype)的继承机制。

作为第一个主流的lambda语言,相对Java来说,其与Lisp和Scheme有更多的共同点(JavaScript: The Good Parts里有解释,没看过的建议去翻翻)。

他只有简单的面向对象。

当然,Brendan Eich作为设计者,他一点也不喜欢自己的这个作品:
"与其说我爱Javascript,不如说我恨它。它是C语言和Self语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:'它的优秀之处并非原创,它的原创之处并不优秀。'(the part that is good is not original, and the part that is original is not good.)"


哦,对了至于面向对象的至高境界,建议移驾云风的一篇文章
http://blog.codingnow.com/2010/03/object_oriented_programming_in_c.html
去观看,不是不可以,玩玩嘛,蛮好的,但是我觉得什么语言你干什么事,按着语言设计思路来保险点。
yun77op
2013-02-05 15:02:15 +08:00
js中的class是通过new function实现的,方式和传统的java那种不一样,并不是说不存在

复用代码的核心(之一)是模块化,场景不同可以使用直接使用对象、工厂模式、Cached Functions in the Module Pattern、prototype模式等

“觉得JS提供的匿名函数、闭包等特性就能够达到代码封装和可扩展的目的” 不是可以实现就可以,还要考虑可维护性
Narcissu5
2013-02-05 15:09:12 +08:00
其实看到这个帖子我就想说原型继承到底是不是面向对象也是程序界的热点圣战之一。翻了翻回复发现根本不用说,已然掐起来了-_-!

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

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

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

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

© 2021 V2EX