最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术。为了让个人代码多点艺术,我就从新温故了《javascript高级程序设计》(其中几章),而后又看了《javascript设计模式》,而后以为要写点心得体会,来整理本身所学的吧。如下是我我的看法,错了请轻喷,欢迎指出错误,乐于改正。javascript
1、封装java
(1)封装通俗的说,就是我有一些秘密不想让人知道,就经过私有化变量和私有化方法,这样外界就访问不到了。而后若是你有一些很想让你们知道的东西,你就能够经过this建立的属性看做是对象共有属性和对象共有方法,这样别人知道你的公共的东西啦,不止如此,你还能够访问到类或对象自身的私有属性和私有方法。哇,这种权利好大呀,外面的公共的方法和属性,和内部的私有属性和方法均可以访问到,都有特权啦,所以就叫作特权方法了。看个例子就知道啦。设计模式
类的内部this上定义的属性和方法天然就能够复制到新建立的对象上,成为对象公有化的属性和方法,又能够访问私有属性和私有方法,所以就叫特权方法。闭包
这样调用就能够啦函数
(2)闭包实现的封装测试
闭包是有权访问另一个函数做用域中变量的函数,即在一个函数内部建立另一个函数。这时就能够将闭包做为建立对象的构造函数,这样它既是闭包又是可实例对象的函数。this
2、继承prototype
(1)类设计
每一个类有3个部分:1,是构造函数内的,是供实例化对象复制用的。2,是构造函数外的,直接经过点语法添加的,这是供类使用的,实例化对象是访问不到的。3,是类的原型中的,实例化对象能够经过其原型链简介地访问到,也是为供全部实例化对象所共有的。3d
(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)多继承
经过这种方式对一个对象属性的复制继承,将多个父类(对象)的属性与方法拷贝给子类实现继承
3、多态
多态就是经过对传递的参数判断来执行逻辑,便可实现一种多态处理机制
下面就是这个例子,经过多态类,调用add运算方式,根据不一样参数作运算
这就是面向对象的三种特性啦,封装、继承、多态,对原理的理解,能在看其余人的优秀代码的时候,有个很好的理解。