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 · 6038 次点击
    这是一个创建于 4180 天前的主题,其中的信息可能已经有所发展或是发生改变。
    好久没来发帖了,一直处于万年潜水的状态。不知道还有没有朋友认识我。

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

    感觉创业有点疲劳了,想去找点工作学点东西。然后去某公司应聘前端。
    其实很长一段时间我都是那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  
       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  
       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   ·   实用小工具   ·   2749 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.