Javascript对象构造器与原型对象

2020-06-28 作者: 硬汉无敌

创建一个新对象的最简单的方法,就是使用如下的语句:

  1. obj = {};

像这样创建一个新的空对象后,我们可以通过赋值语句添加属性:

  1. obj.name = 'apple';
  2. obj.isRed = function(){
  3. return true;
  4. };

像面向对象语言Java一样,JavaScript也提供了new操作符,通过构造函数初始化新对象,但是没有真正的类定义。通过操作符new,应用于构造函数之前,来创建一个新对象分配。

这里引入一个新的概念“原型对象”,每个函数都有一个“原型对象”,该原型对象指向创建对象的函数。接下来看看清单-1。

  1. /*
  2. 清单-1 
  3. 通过new创建新的对象
  4. */
  5. //定义一个空函数,什么也不做,也没有返回值
  6. function Apple(){} 
  7. //在“原型对象”上添加个函数
  8. Apple.prototype.isRed = function(){
  9.   return true;
  10. };
  11. //创建对象
  12. apple01 = new Apple();
  13. //不仅创建了新的实例,并且实例上具有原型上的方法
  14. if(apple01 && apple01.isRed &&apple01.isRed())
  15. 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的属性。

【注意】只有函数有“原型对象”,在写程序时要注意。