首页
创建object对象
创建object对象
版权声明:本文为原创内容,转载请声明出处。
原文地址:http://www.excelib.com/article/242/show

我们前面跟大家说过,ES中的function除了前面的两种用法之外还有一种非常重要的用法,那就是创建object实例对象,关于object类型对象的具体内容学生下一章给大家详细讲解,本节我们主要来学习如何使用function来创建object对象以及创建时的一些细节的问题。

创建方式

使用function对象创建object类型对象的方法非常简单,直接在function对象前面使用new关键字就可以了,比如下面的例子

1
2
3
4
5
function F(){
     this.v = 1;
 }
 var obj = new F();  //创建F类型对象obj
 console.log(obj.v); //1

这里我们首先定义了一个function类型的对象F,然后使用F创建了object类型的对象obj,最后在控制台打印出了obj对象的v属性的值。使用function(比如F)创建了object类型的对象(比如obj),只需要在function对象(F)前加new关键字就可以了,也就是说对于一个function类型的对象来说如果调用时前面没有new关键字就是调用方法处理业务,如果前面有new关键字那么就是用来创建对象,当然创建对象时函数体也会被执行,具体创建的步骤我们下一节详细讲解。

其实我们经常使用的ArrayDate等对象也都是function类型,也都可以使用new关键字来创建相应的object类型的对象实例。

为了区分主要用于处理业务的function和主要用于创建对象的function,一般会将主要用于创建对象的function的首字母使用大写而将主要用于处理业务的function的首字母使用小写,不过这只是人为的区分,实际功能上并没有本质的区别。

创建过程

使用function创建object类型对象的创建过程可以简单地分为两步(我们可以这么理解,实际创建过程要复杂一些):

1、  创建function所对应类型的空object对象;

2、  将function的函数体作为创建出来的object对象的方法来执行(主要目的是初始化object对象)。

比如下面的例子

1
2
3
4
5
6
function Car(color, displacement){
     this.color = color;
     this.displacement = displacement;
 }
 var car = new Car("black""2.4T"); 
 console.log(car.color+","+car.displacement);    //black, 2.4T

这个例子中我们首先新建function类型的Car,然后使用他创建object类型的car实例对象。在新建car对象时首先会新建Car类型的空对象car,然后再将Car函数作为新建出来对象的方法来调用,从而初始化新建出来的car实例对象。也就是相当于下面的过程

1
2
3
4
5
6
7
8
function Car(){}
 var car = new Car();
 car.init = function (color, displacement){
     this.color = color;
     this.displacement = displacement;
 };
 car.init("black""2.4T");
 console.log(car.color+","+car.displacement);    //black, 2.4T

这里将原来Car对象中的函数体的内容放到了新建出来carinit方法中,在使用Car创建完car实例对象后再调用init方法来进行初始化,这种方式和前面例子中将初始化内容放到Car的函数体内的效果是完全相同的。

理解了对象创建的过程就可以理解为什么在构造函数(比如Car)中使用this就可以将属性添加的新创建出来的对象上了,因为这时的函数体就相当于创建出来对象的一个方法,方法中的this指的就是创建出来的对象自身,给this赋值就是给创建出来的对象赋值,所以在function对象中使用this就可以给新创建出来的对象添加属性了,就像第一个例子中的Car方法的this.color = color语句就会给创建出来的car对象添加color属性并将color参数的值赋给他。

如果大家觉得这里理解的不太清楚也没关系,因为我们还没有学习object类型对象和this关键字的具体含义,现在可以先继续往下看,等学习完相关内容之后再返回来看理解起来就容易了。

另外,在使用function创建对象时有一种特殊情况大家需要注意,当function的函数体返回一个对象类型时,使用new关键字创建的对象就是返回的对象而不是function所对应的对象了,比如下面的例子

1
2
3
4
5
6
7
8
9
10
function F(){}
 function Car(color, displacement){
     this.color = color;
     this.displacement = displacement;
     return new F();
 }
 var car = new Car("black""2.4T");
 console.log(car.color+","+car.displacement);        //undefined,undefined
 console.log(car instanceof Car);                             //false
 console.log(car instanceof F);                                //true

这里有两个function对象:FCar,在Car的函数体中返回了新建的F类型实例对象,这时使用Car新建出来的car对象就成了F类型的实例对象而不是Car的实例对象了。