admin管理员组

文章数量:1530847

2024年6月14日发(作者:)

JavaScript prototype 的深度探索

JavaScript 中对象的prototype 属性,可以返回对象类型原型的引用。这是一个相当

拗口的解释,要理解它,先要正确理解对象类型(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》)它不

是本文讨论的范围。

本文标签: 对象原型关系类型实例