···往往会把一件完整的东西化成无数的形象。就像凹凸镜一般,从正面望去,只见一片模糊。
————威廉-莎士比亚
伪类(Pseudoclassical)
当一个函数对象被创建时,Function构造器产生的函数对象会运行类似这样的代码:
1 | this.prototype={constructor:this}; |
新函数对象自动被赋予一个prototype
属性,它的值是一个包含constructor
属性以及存放继承特征的对象。constructor
属性没什么用,重要的是prototype
对象。
用new
前缀去调用一个函数时,函数执行的方式会被修改。如果new运算符是一个方法而不是一个运算符,如下
1 | Function.method('new',function(){ |
注意:调用构造函数时没有加上new
前缀,那么this
将不会被绑定到一个新对象上,而是被绑定到全局对象上。这样不仅没有扩充新对象,反而破坏了全局变量环境。
对象说明符
可以将一大串参数,构建成有说明规格的对象
1 | var myObject=marker(f,l,m,c,s); |
原型(Prototypal)
纯粹的原型模式可以避免把一个应用拆解成一系列嵌套类的分类过程,转而专注于对象。
函数化(Functional)
继承模式的一个弱点是没法保护隐私,函数化模式可以解决这个问题。简单分四步:
- 创建一个新对象
- 有选择的定义私有实例变量和方法。函数中通过var定义的普通变量。
- 给这个对象扩充方法。这些方法有特权去访问参数,以及第2步中通过var定义的变量。
- 返回那个新对象。
函数化构造器的伪代码模板:
1 | var constructor=function(spec,my){ |
函数化构造器详细讲解:
spec
对象包含构造器需要构造一个新实例的所有信息。my
对象是一个为继承链中的构造器提供秘密共享的容器。可以选择性使用。接下来,声明该对象(即返回的
that
)私有的实例变量和方法。接下来,给
my
对象添加共享的秘密成员。1
my.member=value;
构造一个新对象并把它赋值给
that
。很多种方式创建一个新对象。接下来,扩充
that
,加入组成该对象接口的特权方法。先把函数定义为私有方法,然后再把它们分配给that
:1
2
3
4
5var methodical=function(){
...
};
that.methodical=methodical;返回
that
。
例子:
1 | var mamal=function(spec){ |
函数化模式还提供一个处理父类方法的方法。构造一个superior方法,取得一个方法名并返回调用那个方法的函数,该函数会调用原来的方法。
1 | Object.method('superior',function(name){ |
函数化模式有很大灵活性。比伪类(构造函数)模式不仅带来工作更少,还让我们得到更好的封装和信息隐蔽,以及访问父类方法的能力。
部件
可以从一套部件中把对象组装出来。
我们可以构造一个给任何对象添加简单事件处理特性的函数。它给对象添加一个on方法、一个fire方法和 一个私有的事件注册表对象:
1 | var eventuality=function(that){ |