首页
三种子类型
三种子类型
版权声明:本文为原创内容,转载请声明出处。
原文地址:http://www.excelib.com/article/246/show

学生在前面给大家介绍过,ECMAScript中的function有三种用法:作为对象使用、处理业务以及创建object类型的实例对象,跟这三种用法相对应的有三种子类型:对象的属性、变量和创建出来的object实例对象的属性,这三种子类型是相互独立的,而且也很容易区分,不过有些读者可能会因为不了解这一点,所以经常会将他们混淆,混淆之后就会带来不必要的错误,所以一定要将他们区分清楚,本节学生先来分别给大家介绍一下这三种子类型。

function作为对象来使用

这种情况下function对象的子类型就是对象自己的属性,这时通过点操作符“.”(或者方括号)来使用,比如下面的例子

1
2
3
4
5
6
function book(){}
 book.price = 161.0;
 book.getPrice = function () {
     return this.price;
 }
 console.log(book.getPrice());               //161

在这种情况下function是作为object类型的对象来使用的,上面的例子中首先定义了function类型的book对象,然后给他添加了price属性和getPrice方法属性,这时就可以直接使用点操作符来对其进行操作了。

function用于处理业务

这种情况下function的子类型就是自己定义的局部变量(包括参数),这时的变量是在方法被调用时通过变量作用域链来管理的,变量作用域的相关内容我们在前面已经讲过了,如果您对变量作用域链的印象不深可以返回去查阅相关章节。

function用于创建对象

这种情况下对应的子类型是使用function所创建出来的对象实例的属性,主要包括在function中通过this添加的属性,以及创建完成之后实例对象自己添加的属性,另外还可以调用functionprototype属性对象中所包含的属性,比如我们前面用过的Car的例子

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

这时候创建出来的car对象就包含有colordisplacement两个属性,而且还可以调用Car.prototypelogMessage方法属性。当然,创建完之后还可以使用点操作符给创建出来的car对象添加或者修改属性,也可以使用delete删除其中的属性,比如下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Car(color, displacement){
     this.color = color;
     this.displacement = displacement;
 }
 Car.prototype.logMessage = function(){
     console.log(this.color+","+this.displacement);
 }
 var car = new Car("black""2.4T");
 car.logColor = function () {
     console.log(this.color);
 }
 car.logColor();                 // black
 car.color = "red"
 car.logColor();                 // red
 delete car.color;
 car.logColor();                 //undefined

这里我们在创建完car对象后又给他添加了logColor方法,可以打印出carcolor属性。添加完logColor方法后直接调用就可以打印出car原来的color属性值(black),然后我们将其修改为red之后再打印就打印出了red,最后我们使用delete删除掉carcolor属性,这时再调用logColor方法时就会打印出undefined