昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗?

便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)!

首先面向对象有三大特色,封装、继承及多态,这三个都是抽象的概念。

其中继承这个抽象的概念,是为了避免多个类别间重复定义了相同行为与实作。基本上有两种实作的方式可以实现,「原型继承」与「类别继承」。

这两者分别的特色如下。

类别继承classical inheritance:

可以从同一个类别(class)中实例多个物件。

可以将类别组织成层次结构,进而重覆使用代码。

常用的代码(More general code)将会储存在高阶的类别,由低阶的类别继承。

什么是常用的代码?举例来说,如果今天有两只不同品种的狗,但是叫声都是一样的,那我们便会把叫声储存在高阶的类别:

public class dog {

public String voice =“wong!”;

}

public class GoldenRetriever extends dog {

public String color =“gold”;

}

意味者物件与其它物件共享相同类别及父类别。

建立物件的时候,会需要先写出一个物件的类别(Class),然后,才利用这个类别来建立包含数据的物件,物件受限于类别而无法即时新增属性和方法。

Java或C++的继承是在定义类别时指定要继承的类别来当作父类别(SuperClass)

原型继承prototypal inheritance

物件直接继承其他物件,没有所谓的类别,需要物件就直接写一个(rgyqjy)。

物件利用层级结构连接在一起,所以仍然可以重复使用。

每个物件都跟创建它的物件有秘密连接,这形成一个链。

物件被呼叫自己没有的属性时,它的父层将被呼叫,不断往上找直到找到或到达根物件为止。

继承是经由指定物件的Prototype物件来达成的。

可以在建立后的任何时间,透过Prototype属性来指定要继承的物件

只要被继承的物件新增属性或方法,继承的物件也可以马上使用这些新增的属性和方法

方法和属性可以动态新增,因此,弹性会比需要定义类别式的语言来得大,但是,相对的,程序结构就比较不严谨,也比较容易发生执行时期的错误!

所以在JS中的每个函式(他们都是物件),实际上都有一个prototype的成员,负责在被呼叫物件时提供。

拥有这个成员允许了建构式的运作。

将属性新增至函式物件的prototype可使它被使用于建构式的物件,以及从这建构式继承的物件。

JS的原型继承是继承这个抽象概念的实现方式的一种。

以上就是关于两种继承的比较,如果有错误及来源为附上欢迎留言指正,那么我们明天见(rgswgy)!

学JS的心路历程-JS支持面向对象?(一)的更多相关文章

  1. 学JS的心路历程-JS支持面向对象?(二)

    昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...

  2. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  3. 学JS的心路历程 - JS的Class

    没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...

  4. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

  5. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  6. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  7. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  8. 学JS的心路历程-物件与原型(三)

    昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...

  9. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

随机推荐

  1. JSP:注册&登录

    数据库:Mysql 除了_id自动增长,其余全是varchar 注册:register.jsp <%@ page language="java" import="j ...

  2. Linux性能优化 第四章 性能工具:特定进程CPU

    4.1进程性能统计信息 4.1.1. 内核时间VS用户时间 一个应用程序所耗时间最基本的划分是内核时间与用户时间.内核时间是消耗在Linux内核上的时间,而用户时间则是消耗在应用程序或库代码上的时间. ...

  3. solr系统query检索词特殊字符的处理

    solr是基于 lucence开发的应用,如果query中带有非法字符串,结果很可能是检索出所有内容或者直接报错,所以你对用户的输入必须要先做处理.输入星号,能够检索出所有内容:输入加号,则会报错. ...

  4. python import问题

    python中包:一个文件夹中必须要有__init__.py文件,才能被识别为 包,才能被其他模块引入python中 模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path ...

  5. shell 的有用函数

    1.isNumber 2.命令可用 3.当前用户是root 1.isNumber 判断“字符串”是否是个数字: declare chkNumber= isNumber(){ parameter1=$ ...

  6. [Unity插件]Lua行为树(七):行为树嵌套

    在上一篇的基础上,可以测试下行为树的嵌套,所谓的行为树嵌套,就是在一棵行为树下的某一个分支,接入另一棵行为树. 以下面这棵行为树为例: TestBehaviorTree2.lua TestBehavi ...

  7. 5.2_k-means案例分析

        k-means案例分析 手写数字数据上K-Means聚类的演示 from sklearn.metrics import silhouette_score from sklearn.cluste ...

  8. 【转】netstat 的10个基本用法

    5. 获取进程名.进程号以及用户 ID 查看端口和连接的信息时,能查看到它们对应的进程名和进程号对系统管理员来说是非常有帮助的.举个栗子,Apache 的 httpd 服务开启80端口,如果你要查看 ...

  9. jquery移除select下所有的option选项

    $("#search").find("option").remove(); 或者 $("#search").empty();

  10. GridView Bind 短日期 格式

    ASP.NET的GridView控件的编辑模板中,需要绑定数据库中的某个字段,如<%# Bind("startTime","{0:d}") %> 在 ...