一般面向对象包含:继承,封装,多态,抽象
对象形式的继承
浅拷贝
1  | var Person = {  | 
- 从上面的结果看出,浅拷贝的缺陷在于修改了子对象中引用类型的值,会影响到父对象中的值,因为在浅拷贝中对引用类型的拷贝只是拷贝了地址,指向了内存中同一个副本
 
深拷贝
1  | function extendDeeply(p, c){  | 
- 利用递归进行深拷贝,这样子对象的修改就不会影响到父对象
 
1  | extendDeeply(Person, programer);  | 
利用call和apply继承
1  | function Parent(){  | 
ES5中的Object.create()
1  | var p = { name : 'allin'};  | 
Object.create()作为new操作符的替代方案是ES5之后才出来的。我们也可以自己模拟该方法:
1  | //模拟Object.create()方法  | 
- 目前,各大浏览器的最新版本(包括
IE9)都部署了这个方法。如果遇到老式浏览器,可以用下面的代码自行部署 
1  | if (!Object.create) {  | 
类的继承
Object.create()
1  | function Person(name, age){}  | 
调用父类方法
1  | function Person(name, age){  | 
封装
命名空间
js是没有命名空间的,因此可以用对象模拟
1  | var app = {}; // 命名空间app  | 
静态成员
1  | function Person(name){  | 
私有与公有
1  | function Person(id){  | 
模块化
1  | var moduleA;  | 
多态
模拟方法重载
arguments属性可以取得函数调用的实参个数,可以利用这一点模拟方法的重载
1  | function demo(a, b ){  | 
1  | //实现可变长度实参的相加  | 
方法重写
1  | function F(){}  | 
抽象类
- 在构造器中 
throw new Error(''); 抛异常。这样防止这个类被直接调用 
1  | function DetectorBase() {  |