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

JavaScript 的**继承**通常被运用在哪些场景?根据你的经验来谈谈吧!

  •  
  •   miniwade514 · 2014-03-06 15:47:31 +08:00 · 5822 次点击
    这是一个创建于 3948 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前写一个简单的“双人对战打砖块”的小游戏时,砖块、挡板是父类,双方各自的砖块、挡板是子类。这是我记得的唯一一次使用继承。平时的网页里写的JS基本没用过继承(彻底暴露菜鸟身份……)。

    可能是因为我对面向对象的概念理解不够深,所以没能充分利用 JS 面向对象的优势。

    请各位不吝分享,自己平时都会在哪些时候使用继承?怎么用?

    谢谢!
    22 条回复    1970-01-01 08:00:00 +08:00
    otakustay
        1
    otakustay  
       2014-03-06 16:12:02 +08:00
    5万行以上js组成的系统,页面可以分类,通用性很大(比如用户列表、书列表、借阅列表、列表列表列表表单表单表单)……
    hkongm
        2
    hkongm  
       2014-03-06 16:37:57 +08:00   ❤️ 1
    个人看法:JS这几年太强调OO了,不适合JS本身。
    只要能完成需求,出产品,无所谓是否OO。别跟自己过不去
    hitsmaxft
        3
    hitsmaxft  
       2014-03-06 16:57:54 +08:00
    @hkongm 只能说明项目不大, 随便写写就行
    FrankFang128
        4
    FrankFang128  
       2014-03-06 17:05:24 +08:00
    一般不用继承,用构造函数加属性就好了。
    不要在写 JS 的时候想着 Java,身在曹营心在汉!
    JS 是面向对象,Java 是面向类,理念不同。
    dorentus
        5
    dorentus  
       2014-03-06 18:20:10 +08:00
    Javascript 有继承吗?
    bakac
        6
    bakac  
       2014-03-06 18:21:54 +08:00
    都是原型链上加东西而已
    arbipher
        7
    arbipher  
       2014-03-06 18:32:48 +08:00
    为什么JS面向对象很难理解,因为“继承”这种方式不是在所有的OO中都用得到的。

    OO还有基于对象clone的OO(self),有基于继承的(java),基于原型的(JS)。
    JS的“继承”和它本身的原型混杂在一起。
    Julyyq
        8
    Julyyq  
       2014-03-06 18:39:30 +08:00   ❤️ 1
    首先,实现JS继承的方法有很多种,不止是简单的在原型链上加东西而已。
    其次,实际应用场景在大项目中使用比较多,因为往往大项目中功能比较复杂,如果不做好代码的抽象和封装,那么你越写就感觉越“难写”,更别说将来维护你代码的人了。
    最后,举个栗子,比如一个网站中有个Search类(就像百度首页那样输入搜索内容,下面会有提示的东西),比较好的实践是Search类继承自Input类,Search类只负责“搜索”,Input类只负责“设置数据”,“获取数据”等和用户的输入值相关的操作。像这样每个类各司其职,代码的藕合度就会大大降低,扩展性也会得到非常大的提高。
    otakustay
        9
    otakustay  
       2014-03-06 18:57:35 +08:00
    @FrankFang128 无论js是什么方式的OO,他都是OO,有OO就有继承嘛,原型继承也是继承,我想楼主也没说是java的那种基于class的继承

    我认为继承还是需要的,但要有js的特色,比如社会主义……(有快递我去开下门)

    复习下,面向对象3大特性:封装性、多态性、继承性,和怎么样OO没有关系
    FrankFang128
        10
    FrankFang128  
       2014-03-06 20:11:57 +08:00
    @otakustay JS 当然是 Object-oriented,Java 倒像是 Class-oriented。
    otakustay
        11
    otakustay  
       2014-03-06 21:04:17 +08:00   ❤️ 1
    @FrankFang128 厄……我的概念和你不一样,我是这么认为的:
    1. JS和JAVA都是Object-oriented
    2. JS是prototype based object-oriented
    3. Java是class based object-oriented
    darasion
        12
    darasion  
       2014-03-06 23:14:38 +08:00
    没啥优势。
    反正我不用继承。
    miniwade514
        13
    miniwade514  
    OP
       2014-03-07 00:39:23 +08:00
    @otakustay ,@hitsmaxft ,@Julyyq
    看来还是在大项目中用得多,有很多要被重用的功能,就封装到类

    @hkongm ,@darasion
    我相信还是有适合使用继承的场景的,但是我经验不足导致无法拿捏

    @FrankFang128
    I wish I knew Java @_@

    @arbipher
    我一直以为JS是基于“原型”的“继承”啊,听你一说有点懵了……

    感谢各位的精彩回复!
    不过还是很期待各位分享一下对 “在哪些时候使用继承?” 的见解啊!
    miniwade514
        14
    miniwade514  
    OP
       2014-03-07 00:43:36 +08:00
    如果能举个栗子,那就更好了! 多谢
    arbipher
        15
    arbipher  
       2014-03-07 01:01:12 +08:00
    @miniwade514 我说的不准,后来也没法修改了。我的意思就是11楼。继承只是OO的一种方法。
    muyeyang
        16
    muyeyang  
       2014-03-07 02:10:03 +08:00 via iPad
    觉得Javascript用mixin比较多。继承没有什么用。

    个人以为,面向对象的核心应该是:
    1 消息
    2 委托

    消息通讯把每一对象的实现隐藏在接口之下。
    通过把复杂的功能委托给其他对象,使得每个对象只用关心自己的核心问题。
    arbipher
        17
    arbipher  
       2014-03-07 02:55:31 +08:00 via iPhone
    @muyeyang 我觉得OO的核心是 消息传递和多态。委托更像是实现技巧,或者说设计模式。
    好吧,我是来抠字眼的。
    sivacohan
        18
    sivacohan  
       2014-03-07 12:42:21 +08:00
    先说明,js我连入门都算不上……

    似乎有这么一句话 “面向对象除了在GUI上其他方面并没有什么优势” 大概是在Unix编程艺术里面提到的

    如果js很贴近响应,那基本就没办法写什么面向对象了。各种事件什么的。

    如果做web app的话,可以把逻辑提取出来,做点抽象。如果做动画库的时候,也可以考虑抽象点东西出来。

    我现在些js的话,通常会分出这么几个类型的。models,数据类型,里面会做一些数据的过滤和绑定之类的东西。helper,简单的帮助类,不允许有人继承helper,但是helper有可能继承models。tpl,直接对应templates,这里面的东西都是一次性的了……
    miniwade514
        19
    miniwade514  
    OP
       2014-03-07 13:22:10 +08:00
    @sivacohan 看来除非写的东西已经达到了框架/库的复杂度(就像你说的动画库、和你自己实现的MVC),否则继承的运用场景确实不是很多。就我自己的经验而言,一般也就抽象到类,很少用继承再去抽象出子类什么的。
    vilic
        20
    vilic  
       2014-03-07 14:03:11 +08:00
    个人一时的观点. JS 继承用得不多的一个很重要的原因是, 不方便. 所以大家没有这个习惯. 但实际上有很多异曲同工的方法被广泛地使用了, 本质上它们的作用是一样的.
    yakczh
        21
    yakczh  
       2014-03-07 19:48:51 +08:00
    js都是实例的引用,所谓的继承就是把引用的值都复制一份,还分深浅复制,其实js实例就是个{}容器,开始把能想到的属性写上去,程序在执行的时候,需要什么再加什么就行了
    miniwade514
        22
    miniwade514  
    OP
       2014-03-07 22:45:18 +08:00
    @vilic
    @yakczh
    所以总结下来,JS是用原型链,其他一些语言用class,做的事情是一样的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.