首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议95:慎重使用实例继承

关灯直达底部

对类进行实例化操作就会产生一个新的对象,这个实例对象将继承类的所有特性和成员,而实例继承正是对于这种实例化过程的一种概括。类继承和原型继承在客户端是无法继承DOM对象的,同时它们也不支持继承系统静态对象、静态方法等。为了更直观地说明此问题,不妨先看下面两个示例。

(1)使用类继承法继承Date对象


function D{//自定义构造函数

Date.apply(this,arguments);//调用Date对象,对其进行引用,实现继承的目的

}

var d=new D;//实例化自定义构造函数

alert(d.toLocaleString);//[object Object]


上面的示例说明,使用类继承无法实现对静态对象的继承,这是因为系统对象的结构比较特殊,它不是简单的函数体结构,对声明、赋值和初始化等操作都进行了独立的封装,所以无法实现在自定义构造函数中的那种操作。

(2)使用原型继承法继承Date对象


function D{//自定义空构造函数

}

D.prototype=new Date;//把Date对象的实例赋值给D的原型对象

var d=new D;//实例化D

alert(d.toLocaleString);//错误提示


上面的示例说明了使用原型继承也无法实现对静态对象的继承。不过,使用实例继承法能够实现对所有JavaScript核心对象的继承。例如,在下面的示例中,把Date对象的实例化过程和方法调用封装在一个函数中,然后返回实例对象,这样就可以解决核心静态对象无法继承的问题。


function D{//封装函数

var d=new Date;//实例化Date对象

d.get=function{//定义本地方法,间接调用Date对象的toLocaleString方法

alert(d.toLocaleString);

}

return d;//实例对象

}

var d=new D;//实例化封装函数

d.get;//调用本地方法,返回当前本地的日期和时间


构造函数是一种特殊结构的函数,它没有返回值,通过this关键字来初始化实例对象。当然,在构造函数中可以增加return语句,为其设置一个返回值,这时返回值就是new运算符执行表达式的值。因此,在构造函数中完成对类的实例化操作,然后返回实例对象,这就是实例继承的由来。

❑使用实例继承法能够实现对所有对象的继承,包括自定义类、核心对象和DOM对象等。不过也应该清楚实例继承的缺点,它不是真正的继承机制,仅是一种模拟方法。

❑实例继承法无法传递动态参数。类的实例化操作是在封闭的函数体内实现的,不能够通过call或apply方法来传递动态参数。如果继承需要传递动态参数,那么这种继承就会带来很多不便。

❑实例继承只能够返回一个对象,与原型继承一样,不支持多重继承。

❑由于通过封装的方法把对象实例化和初始化操作都封装在一个函数体内,因此最后通过对封装函数执行实例化操作来获取继承的对象。但这种做法无法真正实现继承对象是封装类的实例,它仍然保持与原对象的实例关系。