一般面向对象包含:继承,封装,多态,抽象
对象形式的继承
浅拷贝
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() { |