关于Javascript的面向对象 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
panlilu
V2EX    Javascript

关于Javascript的面向对象

  •  
  •   panlilu 2013-07-18 18:36:05 +08:00 6492 次点击
    这是一个创建于 4473 天前的主题,其中的信息可能已经有所发展或是发生改变。
    好久没来发帖了,一直处于万年潜水的状态。不知道还有没有朋友认识我。

    不要被标题骗了,其实这是个吐槽帖。

    感觉创业有点疲劳了,想去找点工作学点东西。然后去某公司应聘前端。
    其实很长一段时间我都是那coffeeScript写前端的,不过反正也就是个语法糖,其实也没什么很不一样的地方。
    由于是朋友内推加上我从来没有面试过,加上可能对自己的能力有点太自信了,所以完全没有任何准备。。(真该去看看类似前端面试宝典之类的东西)
    面试官先问 Javascript/css/html 你比较熟悉哪个?然后我说Javascript吧。
    然后接着问,面向对象的三个基本特征是什么。
    我愣住了,说实话平时用OOP就是为了让代码看上去好看点,封装的漂亮点,偶尔可以重用下罢了。突然问我这个,我真的一下子答不上来。然后我个人心里素质也不太好,一下子就有点慌了。
    然后问我Javascript怎么实现这三个特性。
    我只知道Javascript的OOP实现是很裸的,也不怎么原生,大概就是把被继承的放到prototype里面,然后执行的时候会自己去一层层的链式调用。不过我也忘了当时是怎么说的。
    总之最后的结果是,认为我的基础不够,能力在他们前端的平均能力之下,然后被拒了。

    很久以前在v2ex上面看到一篇帖子讨论过 不会OOP的Javascript的程序员就是野生程序员之类的。

    看来我也属于一个野生程序员。

    吐槽完毕。
    最后友情提示大家面试前一定要准备一下(也许面试前不准备的大概也就剩我一个了吧)。
    38 条回复    1970-01-01 08:00:00 +08:00
    yakczh
        1
    yakczh  
       2013-07-18 18:37:44 +08:00
    抽象,封装,重载
    panlilu
        2
    panlilu  
    OP
       2013-07-18 18:40:03 +08:00
    @yakczh 额,明显是 封装、继承和多态 吧。
    cloud_dai
        3
    cloud_dai  
       2013-07-18 19:07:04 +08:00
    pan大神,来仰慕了。
    jiyinyiyong
        4
    jiyinyiyong  
       2013-07-18 19:42:24 +08:00
    类的面向对象, 原型的面向对象, JS 先后被 Java 程序员影响
    乱七八糟的类型构造器, 迟到到 __proto__ 属性...
    其实我很想问楼主那是哪里的工作, 可以用 CoffeeScript?
    chone
        5
    chone  
       2013-07-18 19:50:38 +08:00 via iPhone
    确实不懂js的oop也能解决问题,但oop确实也是js语言的很重要部分。
    sivacohan
        6
    sivacohan  
    PRO
       2013-07-18 19:57:22 +08:00 via Android
    我认为js谈基于class的面向对象纯粹是耍流氓。
    以后谁再跟我说面向对象,我就给他讲prototype
    switch
        7
    switch  
       2013-07-18 20:08:24 +08:00
    davepkxxx
        8
    davepkxxx  
       2013-07-18 20:39:19 +08:00
    我面试前也从来不准备,只是对着简历看看,然后想想怎么说工作经验的事情。

    关于用 Javascript 实现继承,可以看看 http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html
    panlilu
        9
    panlilu  
    OP
       2013-07-18 20:51:04 +08:00
    @cloud_dai 过奖,哪里是什么大神。
    @jiyinyiyong 之前是自己创业,当然想用什么技术就用什么技术。coffeeScript确实简化了js的面向对象写法,在一些语法上面看上去也更加漂亮。
    @chone 其实我不是不懂js的OOP,只是用到的比较少一下子被问住了而已。
    heroicYang
        10
    heroicYang  
       2013-07-18 21:08:32 +08:00
    好吧,我觉得Javascript OOP都可以算是月经贴了,哈哈~
    leegorous
        11
    leegorous  
       2013-07-18 22:29:41 +08:00
    FP 才是正路啊
    jiyinyiyong
        12
    jiyinyiyong  
       2013-07-18 22:56:35 +08:00
    @sivacohan 讲 Dart 和 ES6 都加入了 class, 找谁说理去
    jiyinyiyong
        13
    jiyinyiyong  
       2013-07-18 22:57:11 +08:00
    @leegorous 太超前了, 结果是浏览器和社区支持跟不上.
    yuelang85
        14
    yuelang85  
       2013-07-18 23:03:11 +08:00
    我觉得js和python面试,被问 oop 是一件很 郁闷 的事情。
    DaniloSam
        15
    DaniloSam  
       2013-07-18 23:28:17 +08:00
    js oop = 月经贴

    面试 = 月经贴

    js oop + 面试 = 月经紊乱贴
    heganj
        16
    heganj  
       2013-07-18 23:44:59 +08:00
    Functional programming is a good thing, Object Orientation is overrated.
    http://clojure.org/rationale
    Hyperion
        17
    Hyperion  
       2013-07-18 23:56:02 +08:00
    好久不见@panlilu 了... 一直对tuoj.in 印象很深...

    Javascript的OOP, 我是看这个才明白的... 阮一峰老师...
    http://www.ruanyifeng.com/blog/2010/05/object-oriented_Javascript_encapsulation.html

    还没毕业的表示对面试有恐惧心理啊, 总害怕自己有啥缺憾会被人拉出来嘲笑... 也害怕遇见奇葩面试官问出小概率问题然后回答不出被对方吐槽... 好恐怖啊
    panlilu
        18
    panlilu  
    OP
       2013-07-19 00:12:59 +08:00 via iPad
    @heganj 我很喜欢lisp的函数式编程思想,而Javascript是我用过的生产环境下这个思想体现最明显的语言了。
    @DaniloSam 月经紊乱,哈哈哈;其实我是来骗金币的。
    @Hyperion 这篇文章几年前看过的,GR里还加着星标的,可惜现在GR没了。。
    sivacohan
        19
    sivacohan  
    PRO
       2013-07-19 00:59:09 +08:00
    @jiyinyiyong 这个问题我这样看,语言仅仅是语言。Javascript语言精粹有一句话我觉得说的一针见血,大概意思是,js里面有糟粕,但是不影响我们只使用精华。我们可以在某个语言中提炼一个子集出来。
    很多语言都有一些不知道为什么产生的没什么用的设计。最常见的一个多余的设计就是在非函数式语言里面玩尾递归。当然,我们可以理解为他的目的是为了减少函数栈,防止溢出blablabla……但是这玩意在函数式语言里有一个重要到必要的作用是实现循环。我们都有for了,还要这玩意干什么,而且尾递归,实际上不就是for吗?
    bitsmix
        20
    bitsmix  
       2013-07-19 01:44:26 +08:00
    @jiyinyiyong 不知道 LZ 说的是哪儿,但是俺们厂的确在大规模的用 coffee
    jiyinyiyong
        21
    jiyinyiyong  
       2013-07-19 09:06:17 +08:00
    @bitsmix 求留名膜拜
    jiyinyiyong
        22
    jiyinyiyong  
       2013-07-19 09:10:35 +08:00
    @sivacohan 函数时语言在网页开发中恐怕体现不出什么优点
    图形界面的应用变大以后面向对象是免不了的, 而 JS 缺的就是 OO
    函数式在研究和理论方面特别有效, 这方面扯就太深了
    Scheme 中为的是达到语法最小实现功能最强, for 被认为是多余
    Haskell 里 for 这种过程式的写法基本上就不是函数式能接受的
    heroicYang
        23
    heroicYang  
       2013-07-19 10:19:49 +08:00
    @jiyinyiyong 这个说法我赞同,目前真正的前端Javascript中,很难不用到OO的。。。尤其是现在的Rich Application (Single Page Application)之流~可能我功力还不够,哈哈~
    bitsmix
        24
    bitsmix  
       2013-07-19 11:22:51 +08:00   1
    @jiyinyiyong admaster
    zythum
        25
    zythum  
       2013-07-19 13:14:10 +08:00
    潘熊猫 好久不见了撒。

    朱一写东西属于随心所欲流派。js的oo是原型继承,知道特性就好了。到时候该怎么用怎么用。
    zythum
        26
    zythum  
       2013-07-19 13:16:23 +08:00
    @jiyinyiyong 如果是大型项目的话 朱一建议 多调用,少继承。 这样万一产品想改个需求啊。变个什么的。不会太被动。
    robertlyc
        27
    robertlyc  
       2013-07-19 13:21:19 +08:00
    差点以为lz准备黑coffee哪
    panlilu
        28
    panlilu  
    OP
       2013-07-19 13:32:43 +08:00
    @zythum 好久不见,我现在在北京,什么时候面基一下?哈哈
    @robertlyc coffee挺好的。。
    middleware
        29
    middleware  
       2013-07-19 14:16:14 +08:00
    面向对象的三个特性:封装、多态、重用。

    继承,不是基本特性,是具体机制。继承可以实现多态(接口继承),但是多态不必非要继承。继承可以实现重用(实现继承),但是重用不必非要多态。

    能说明白继承不是面向对象基本特性的,我这里都会优先考虑。
    jiyinyiyong
        30
    jiyinyiyong  
       2013-07-21 00:26:33 +08:00
    @zythum 啊啊啊 >_< 这招我还是学不会啊
    jiyinyiyong
        31
    jiyinyiyong  
       2013-07-21 00:28:59 +08:00
    @middleware 怎么看"封装 多态 重用"都只是一个特性...
    面向对象的边界到底在纳个地方...
    Golevka
        32
    Golevka  
       2013-07-21 02:41:26 +08:00
    @jiyinyiyong "动态类型语言里面的面向对象说实话我也不知道究竟好在哪里,对于这种语言那来讲,只要做好functional programming的那部分,剩下的OO究竟要不要,纯粹是一个语法糖的问题。在动态类型语言里面,一个类和一个lambda expression的差别其实不大。" 其实我感觉v神说得还是挺对的.

    另外, Haskell里哪来的for?
    jiyinyiyong
        33
    jiyinyiyong  
       2013-07-21 11:18:02 +08:00
    @Golevka 求介绍 v神 是几楼?
    Haskell 里没 for, 我是说 "Haskell 不能接受 for"
    深受 #29 楼感召, 认为图形界面必用 OO, 其他领域 OO 多余
    我想需要的还是那种构建更灵活的作用域的能力, 而不是 OO 这种所谓对真实的模拟
    darasion
        34
    darasion  
       2013-07-21 11:43:36 +08:00
    最近一段时间客串了一把前端。
    发现如果有UE什么的画出设计图,按照设计图一步一步的做下去其实很容易。
    就怕脑子里什么都没有乱写。
    middleware
        35
    middleware  
       2013-07-23 09:03:31 +08:00
    @jiyinyiyong 「封装 多态 重用」怎么可能是一个特性?它们是相互正交的,实现一个并不需要依赖另一个特性。
    jiyinyiyong
        36
    jiyinyiyong  
       2013-07-24 00:53:36 +08:00
    @darasion 只是图的话应该不会有 JS 那么多 Bug 的问题吧
    jiyinyiyong
        37
    jiyinyiyong  
       2013-07-24 00:55:51 +08:00
    @middleware 我理解不准确吧..
    我觉得重用就必须要封装, 同时导致多态成为必要, 完全正交不懂..
    middleware
        38
    middleware  
       2013-07-24 08:27:29 +08:00   1
    @jiyinyiyong 重用不一定封装,实现继承就是反例。多态也是一样可以独立的。平时的项目里很少会故意忽略一项,但是不能说它们是一个特性,各自的侧重还是可以独立调整的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3130 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:05 PVG 20:05 LAX 05:05 JFK 08:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86