JavaScript prototype
http://wenku.baidu.com/view/2881a2ed6294dd88d0d26b5d.html,
先要正确理解对象类型(Type)以及原型(prototype)的概念。
1、什么是prototype JavaScript 中对象的prototype 属性,可以返回对象类型原型的引用。这是一个相当 拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念。
前面我们说,对象的类(Class)和对象实例(Instance)之间是一种“创建”关系, 因此我们把“类”看作是对象特征的模型化,而对象看作是类特征的具体化,或者说,类 (Class)是对象的一个类型(Type)。例如,在前面的例子中,p1 和p2 的类型都是Point, 在JavaScript 中,通过instanceof 运算符可以验证这一点: p1 instanceof Point p2 instanceof Point 但是,Point 不是p1 和p2 的唯一类型,因为p1 和p2 都是对象,所以Obejct 也是它 们的类型,因为Object 是比Point 更加泛化的类,所以我们说,Obejct 和Point 之间有一 种衍生关系,在后面我们会知道,这种关系被叫做“继承”,它也是对象之间泛化关系的一 个特例,是面向对象中不可缺少的一种基本关系。 在面向对象领域里,实例与类型不是唯一的一对可描述的抽象关系,
在JavaScript 中, 另外一种重要的抽象关系是类型(Type)与原型(prototype)。
这种关系是一种更高层次的抽 象关系,它恰好和类型与实例的抽象关系构成了一个三层的链。 在现实生活中,我们常常说,某个东西是以另一个东西为原型创作的。这两个东西可以 是同一个类型,也可以是不同类型。
习语“依葫芦画瓢”,这里的葫芦就是原型,而瓢就是 类型, 用JavaScript 的prototype 来表示就是“ 瓢.prototype = 某个葫芦” 或者 “瓢.prototype= new 葫芦()”。
要深入理解原型,可以研究关于它的一种设计模式——prototype pattern,这种模式 的核心是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 JavaScript 的prototype 就类似于这种方式。 关于prototype pattern 的详细内容可以参考《设计模式》(《Design Patterns》)它不 是本文讨论的范围。 注意,同类型与实例的关系不同的是,原型与类型的关系要求一个类型在一个时刻只能 有一个原型(而一个实例在一个时刻显然可以有多个类型)。对于JavaScript 来说,这个限制有两层含义,第一是每个具体的JavaScript 类型有且仅有一个原型(prototype),在默认的情况下,这个原型是一个Object 对象(注意不是Object 类型!)。第二是,这个对象所属的类型,必须是满足原型关系的类型链。例如p1 所属的类型是Point 和Object,而一个Object 对象是Point 的原型。假如有一个对象,它所属的类型分别为ClassA、ClassB、ClassC和Object,那么必须满足这四个类构成某种完整的原型链。 有意思的是,JavaScript 并没有规定一个类型的原型的类型(这又是一段非常拗口的 话),因此它可以是任何类型,通常是某种对象,这样,对象-类型-原形(对象)就可能构 成一个环状结构,或者其它有意思的拓扑结构,这些结构为JavaScript 带来了五花八门的 用法,其中的一些用法不但巧妙而且充满美感