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