创建一个新对象的最简单的方法,就是使用如下的语句:
obj = {};
像这样创建一个新的空对象后,我们可以通过赋值语句添加属性:
obj.name = 'apple';
obj.isRed = function(){
return true;
};
像面向对象语言Java一样,JavaScript也提供了new操作符,通过构造函数初始化新对象,但是没有真正的类定义。通过操作符new,应用于构造函数之前,来创建一个新对象分配。
这里引入一个新的概念“原型对象”,每个函数都有一个“原型对象”,该原型对象指向创建对象的函数。接下来看看清单-1。
/*
清单-1
通过new创建新的对象
*/
//定义一个空函数,什么也不做,也没有返回值
function Apple(){}
//在“原型对象”上添加个函数
Apple.prototype.isRed = function(){
return true;
};
//创建对象
apple01 = new Apple();
//不仅创建了新的实例,并且实例上具有原型上的方法
if(apple01 && apple01.isRed &&apple01.isRed())
console.log("Instance exists and method is callable.");
在这段代码中,我们定义了一个名为Apple的空函数,函数创建完成之后,立即就获得了一个原型对象(prototype),我们对该“原型对象”进行扩展,添加了isRed方法;然后我们通过new操作符调用Apple函数,将Apple函数作为构造器进行调用,创建一个对象。操作符new返回的结果就是这个新对象的引用。然后我们验证了apple01是新创建的对象的引用,具有isRed方法,并且能执行。我们用chrome浏览器对这段程序进行调试,把Apple和apple01加入“watch”,将断点打在清单的18行,执行,可查看当前应用程序状态。如【图-1】:
【图-1】
每一个函数都具有一个原型对象。
每一个函数的原型对象都有一个constructor属性,该属性指向函数本身。
新创建的对象的原型指向函数的原型对象。
从图-1可以看出,创建的函数都具有一个“原型对象”。最初的原型对象只有一个属性,即constructor属性。该属性指向函数本身。当我们将函数作为构造器进行调用时(如new Apple()),新构造出来的对象的原型被设置为构造函数的原型对象的引用。
在本例中,我们在Apple.prototype上增加了isRed方法,对象apple01创建完成时,对象apple01的原型被设置为Apple的原型对象。这样apple01就可以调用方法isRed,将查找该方法委托到Apple的原型对象上。注意,我们又学到了一种代码复用的方式!
这里isRed方法是Apple的原型对象的属性,而不是apple01的属性。
【注意】只有函数有“原型对象”,在写程序时要注意。