最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术。为了让我的代码多点艺术,我就重新温故了《javascript高级程序设计》(其中几章),然后又看了《javascript设计模式》,然后觉得要写点心得体会,来整理自己所学的吧。以下是我个人见解,错了请轻喷,欢迎指出错误,乐于改正。

一、封装

(1)封装通俗的说,就是我有一些秘密不想让人知道,就通过私有化变量和私有化方法,这样外界就访问不到了。然后如果你有一些很想让大家知道的东西,你就可以通过this创建的属性看作是对象共有属性和对象共有方法,这样别人知道你的公共的东西啦,不止如此,你还可以访问到类或对象自身的私有属性和私有方法。哇,这种权利好大呀,外面的公共的方法和属性,和内部的私有属性和方法都可以访问到,都有特权啦,因此就叫做特权方法了。看个例子就知道啦。

类的内部this上定义的属性和方法自然就可以复制到新创建的对象上,成为对象公有化的属性和方法,又可以访问私有属性和私有方法,因此就叫特权方法。

这样调用就可以啦

(2)闭包实现的封装

  闭包是有权访问另外一个函数作用域中变量的函数,即在一个函数内部创建另外一个函数。这时就可以将闭包作为创建对象的构造函数,这样它既是闭包又是可实例对象的函数。

二、继承

  (1)类

   每个类有3个部分:1,是构造函数内的,是供实例化对象复制用的。2,是构造函数外的,直接通过点语法添加的,这是供类使用的,实例化对象是访问不到的。3,是类的原型中的,实例化对象可以通过其原型链简介地访问到,也是为供所有实例化对象所共有的。

(2)类式继承

通过子类的原型prototype对象实例化来实现的

  

继承就是声明2个类,不过类式继承需要将第一个类的实例赋值给第二个类的原型。这段代码,在实现subClass继承superClass时是通过将superClass的实例赋值给subClass的原型prototype,所以subClass.prototype继承了superClass.

缺点就是:一个子类的实例原型从父类构造函数中继承来的共有属性就会直接影响到其他子类。比如:

额外知识点:instanceof是通过对象的prototype链来确定这个对象是否是某个类的实例,而不关心对象与类的自身结构。

(3)构造函数式继承

构造函数式继承是通过在子类的构造函数作用环境中执行一次父类的构造函数来实现的。

     

SuperClass.call(this,id);是构造函数式继承的精华,call可以更改函数的作用环境。这个对SuperClass调用这个方法就是将子类中的变量子啊父类中执行一遍,由于父类中是给this绑定属性的,因此子类自然也就继承了父类的共有属性。由于这种类型的继承没有涉及原型prototype,所以父类的原型方法自然不会被子类继承,而如果要想被子类继承就必须要放在构造函数中。

  (4)组合继承

组合继承就是:类式继承+构造函数继承

这里用例子来测试下

果然子类的实例中更改父类继承下来的引用类型属性如books,根本不会影响到其他实例,并且子类实例化过程中又能将参数传递到父类的构造函数中。

(5)原型式继承

原型式继承跟类式继承一样,父类对象book中的值类型的属性被复制,引用类型的属性被共有。

(6)寄生式继承

通过在一个函数内的过渡对象实现继承并返回新对象的方式,称之为寄生式继承。

寄生就像寄生虫一样寄托于某个对象内部生长。就是对原型继承的第二次封装,并且在这第二次封装过程中对继承的对象进行了扩展,这样新创建的对象不仅仅有父类中的属性和方法而且还添加了新的属性和方法。

看下下面的例子吧

(7)寄生组合式继承

寄生组合式继承就是寄生式继承+构造函数式继承,

先创建了父类,还有父类的原型方法,然后创建子类,并在构造函数中实现构造函数式继承,然后又通过寄生式继承了父类 原型,最后又对子类添加了一些原型方法。

现在我们来测试一下

显然不会出现子类调用之后,另一个子类的值被改变。在这里其中最大的改变是对子类原型的处理,被赋予父类原型的一个引用,这是一个对象。

(8)多继承

通过这种方式对一个对象属性的复制继承,将多个父类(对象)的属性与方法拷贝给子类实现继承

三、多态

多态就是通过对传递的参数判断来执行逻辑,即可实现一种多态处理机制

下面就是这个例子,通过多态类,调用add运算方式,根据不同参数做运算

这就是面向对象的三种特性啦,封装、继承、多态,对原理的理解,能在看其他人的优秀代码的时候,有个很好的理解。

JS面向对象编程之:封装、继承、多态的更多相关文章

  1. JS面向对象编程之封装

    来源:https://segmentfault.com/a/1190000015843072 我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学 ...

  2. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  3. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  4. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  5. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  6. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  7. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  8. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  9. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  10. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

随机推荐

  1. php的一些小笔记--字符串

    字符串: 转换ASCII函数: ord($tring) 返回ASCII,chr($ASCII)返回相应的字符 把字符串切割成数据的函数: chunk_split($string,$len) chunk ...

  2. freebsd安装和图形界面安装

    通过上述的安装以后只有命令行界面,没有图形界面,如果想使用X Window就需要安装X 11和GNOME(或KDE). 1. 安装X 11(用root账户) 在确保虚拟机的CD-ROM加载了FreeB ...

  3. 基于stm32f103zet6的FAT16文件系统学习1(初识FAT16)

    有了之前读写block的基础之后,准备弄个文件系统,之前没有接触过这东西,所以有很多都晕晕的,但是看到fat的源代码之后还是挺有信心的,因为之前一直过uboot,所以这个文件当然是小巫见大巫了.首先来 ...

  4. USB系列之四:向U盘上写数据

    在<USB系列之三>中,我们实现了一系列的SCSI命令,在这个系列中,我们要实现向U盘上写扇区的命令,所以,本文相对比较容易,更多地是给出一个实现的源程序. 在<USB系列之三> ...

  5. JAVA的类加载器,详细解释

    JVM规范定义了两种类型的类装载器:启动内装载器(bootstrap)和用户自定义装载器(user-defined class loader). 一. ClassLoader基本概念 1.ClassL ...

  6. 【转】6.4.6 将驱动编译进Linux内核进行测试

    原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...

  7. Unity 关于属性的get/set

    学习Unity的可能多数是C#转过来的, 一进来的时候你会发现Unity编写代码,在一些视频或文章中.基本都没有用过get/set使用, 多数是public string name;这样写的公开字段, ...

  8. Calculation(dfs+状压dp)

    Problem 1608 - Calculation Time Limit: 500MS   Memory Limit: 65536KB    Total Submit: 311  Accepted: ...

  9. kettle工具二次开发-代码启动JOB

    kettle工具是一款优秀的数据同步.数据处理的BI工具,收到了很多人的青睐.kettle软件通过可视化的图标可以让我们很轻易的能完成数据同步.处理的开发工作.但是使用kettle可视化界面在跑JOB ...

  10. mysql用户修改登录密码及开启远程登录

    一.修改用户登录密码: mysql> show databases;ERROR 1820 (HY000): You must SET PASSWORD before executing this ...