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

2014-03-06 15:47:31 +08:00
 miniwade514
以前写一个简单的“双人对战打砖块”的小游戏时,砖块、挡板是父类,双方各自的砖块、挡板是子类。这是我记得的唯一一次使用继承。平时的网页里写的JS基本没用过继承(彻底暴露菜鸟身份……)。

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

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

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

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

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

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

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

@FrankFang128
I wish I knew Java @_@

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

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

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

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

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

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

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

我现在些js的话,通常会分出这么几个类型的。models,数据类型,里面会做一些数据的过滤和绑定之类的东西。helper,简单的帮助类,不允许有人继承helper,但是helper有可能继承models。tpl,直接对应templates,这里面的东西都是一次性的了……
miniwade514
2014-03-07 13:22:10 +08:00
@sivacohan 看来除非写的东西已经达到了框架/库的复杂度(就像你说的动画库、和你自己实现的MVC),否则继承的运用场景确实不是很多。就我自己的经验而言,一般也就抽象到类,很少用继承再去抽象出子类什么的。
vilic
2014-03-07 14:03:11 +08:00
个人一时的观点. JS 继承用得不多的一个很重要的原因是, 不方便. 所以大家没有这个习惯. 但实际上有很多异曲同工的方法被广泛地使用了, 本质上它们的作用是一样的.

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

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

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

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

© 2021 V2EX