例: 21.1 对象的三种基本构造法
//第一种构造法:new Object
var a = new Object();
a.x = 1, a.y = 2;
//第二种构造法:对象直接量
var b = {x : 1, y : 2};
//第三种构造法:定义类型
function Point(x, y)
{
this.x = x;
this.y = y;
}
var p = new Point(1,2);
其中,第一种方式是通过实例化一个Obejct来生成对象,第二种方式是通过对象常量,而第三种方式比较特殊,我们先构造了一个function,这个 function代表了一“类”特殊的对象,这类对象描述二维平面上的点,new Point(1,2)表示二维平面上坐标为(1,2)的点,要得到二维平面上坐标为(3,4)的点则可以用new Point(3,4)。
现在我们比较一下这三种方法的差别,第一种方法是通过构造基本对象直接添加属性的方法来实现的。我们说JavaScript是一种弱类型的语言,一方面体 现在JavaScript的变量、参数和返回值可以是任意类型,另一方面也体现在,JavaScript可以对对象任意添加属性和方法,这样无形中就淡化 了“类型”的概念。例如:
var a1 = new Object();
var a2 = new Object();
a1.x = 1, a1.y = 2;
a2.x = 3, a2.y = 4, a2.z = 5;
你既没有办法说明a1、a2是同一种类型,也没有办法说明它们是不同的类型,而在C++和Java中,变量的类型是很明确的,在声明时就已经确定了它们的类型和存储空间。
第二种方法和第一种方法大同小异,实际上你可以将它看成是第一种方法的一种快捷表示法。
比较有趣的是第三种方法:
function Point(x,y)
{
this.x = x;
this.y = y;
}
var p1 = new Point(1,2);
var p2 = new Point(3,4);
你现在知道了p1和p2是同一种类型,它们都是Point的实例。而对于p1和p2来说,Point是它们的“类”,p1、p2和Point之间的关系是创建与被创建的关系,这种关系是面向对象中最重要的一种关系,它是“泛化”关系的一个特例。
通常我们在讨论面向对象时,构造对象时采用的是上面第三种方法,因为“创建”是面向对象中不可缺少的一种“泛化”关系。