前言
JavaScript 提供了一套更为丰富的代码重用模式。代码重用模式可以减少软件开发的成本。本章介绍了几种直接的继承模式。
对象是类的实例,并且类可以从另一个类继承。JavaScript是一门基于原型的语言,意味着对象直接从其他对象继承。
1、伪类
JavaScript 对象从另一个对象继承,需要使用中间层,通过构造器函数产生对象。函数被创建时:
<span style="font-size:18px;">this.prototype = {constructor: this}</span>
prototype 对象是存放继承特征的地方,constructor 没有什么用。
给函数增加 'inherits' 方法来隐藏 prototype。
<span style="font-size:18px;">Function.method('inherits', function (Parent) {
this.prototype = new Parent();
return this;
});</span>
<span style="font-size:18px;">var Mammal = function (name) { // 构造Mammal函数
this.name = name;
}
var Cat = function (name) { // 伪类Cat继承了Mammal函数
this.name = name;
this.saying = 'meow';
}.inherits(Mammal);</span>
构造器函数默认首字母大写,不推荐使用构造器新函数,即使用 new 创建新函数。原因是,如果忘记写 new ,程序不会报错,this 不能绑定到新对象上,而是绑定在全局对象中,引起错误。
2、对象说明符
构造函数的参数在个数过多的情况下,推荐使用对象说明符。将所有参数以一个对象的形式传递到函数内部。好处是参数的顺序可以任意,如果构造器使用默认值,有些参数可以忽略。
<span style="font-size:18px;">var myObject = maker({
first: f,
middle: m,
last: l,
state: s,
city: c
})</span>
3、原型
基于原型的继承:一个新对象可以继承一个旧对象的属性。
差异化继承:定制一个新对象,继承旧对象的属性,指明和它所基于的基本对象的不同。
4、函数化
继承模式不能保护隐私,父对象的所有属性对子对象都是可见的。想创建私有属性,可以应用模块模式。
构造一个生产对象的函数一般包括四个步骤:
a、创建一个新对象。构建对象字面量等。
b、定义私有实例变量和方法。
c、给新对象扩充方法。这些方法拥有特权,可以访问私有变量和方法。
d、返回新对象。
伪代码模板
<span style="font-size:18px;">var constructor = function (spec, my) {
var that, 其他的私有实例变量;
my = my || {};
把共享的变量和函数添加到my中
that = 一个新对象
添加给 that 的特权方法
return that;
}</span>
spec对象包含构造器需要构造一个新实例的所有信息。my包含共享的变量。
在扩充 that 时,先将函数定义为私有方法,再分配给 that 。这样的好处是其他方法要调用该私有方法,可以直接调用,如果 that 的方法被破坏,该私有方法还可以继续使用。
“防伪”对象:对象的所有状态都是私有的,对象的属性可以被替换和删除,但对象的完整性不会受到损害。
“持久性”对象:对象的所有方法都不使用 this 或者 that ,对象的内部状态不能被更改。
5、部件
从一套部件中把对象组装出来。一个可创建包含一系列的功能的函数,使一个对象具有某些组件的功能。