当前位置:编程学习 > JAVA >>

Javascrip基础(二)对象

 

前一篇中我们讲到,Javascript中任何对象o instanceof Object,都会返回true,因此,从这个层面来看,我以认为Javascript中一切都是对象。但是Javascript并不是一种完全面向对象的编程语言,因此对于简单数据类型,我们这样的讨论并没有太大的意义。我们这里所说的对象,主要是指一些复杂的对象,包括函数对象。

我们先从最常见的说起,

varo = newObject()

这个语句定义了一个最普通的对象o,这也是面向对象语言中最长见的对象定义方法。Javascript中所有的对象都可以通过这种方式来定义:

varo = newTypeDef()

这里TypeDef指的是类型的定义,在Javascript内置的类型定义有以下几种:ObjectFunctionDateArray(还有Boolean,这里我们不讨论这种简单类型)

除此之外,一些类型还有一些简单的定义方式,或者可以称之为初始化方式,定义的同时进行初始化,例如:

vararray1 = [];//初始化一个空数组

vararray2 = [1, 2, 3];//初始化一个包含1、2、3三个元素的数组

 

varjson1 = {};//和json1 = new Object();的结果是一样的

varjson2 = {

    name: "json2",

    mytype: "object"

};

一种是数组的初始化方式,一种是现在现在常见的Json写法定义。其中json2是一个对象,包含了name和mytype两个属性,当然,我们也可以在声明之后再为它添加其他的成员,包括属性成员和行为(函数)成员,如下所示:

json1.newProperty = "This is json1's new property";

json2.newProperty = "This is json2's new property";

json1.newFunc = function(){

     // json1's action

};

json2.newFunc = function(){

    // json2's action

};


这样,我们变为json1和json2分别都增加了一个newProperty属性和一个newProperty方法。到这里我们找到了一个自定义复杂对象的途径,实例化一个Object的对象,然后为其添加属性成员和行为成员,或者是通过Json的声明方式,来初始化一个包含属性成员和行为成员的对象,或者是混合两种方式都是可以的。但是这种对象有一个缺点就是无法复用,因为它不是类型,本身就是一个实例,所以说只存在这样一个实例,很多情况下满足不了我们的需求,这个我们会在后续的章节中谈论到。现在我们继续这个对象,我们来使用Json完整定义一个:

varmyObj = {

    name: "my object",

    howToDefined: "Json",

    showMyName: function(){

        returnthis.name;

    }

}

当我们通过myObj.showMyName时,会返回”my object“。

我们看到,在myObj的showMyName的function定义中,我们引入了this关键字,这是面向对象编程中最常用到的一个关键字,而且,在Javascript中也很难理解。在上面得例子中,就是表示myObj这个对象,在这种单一的对象中,理解起来要容易的多,因为它就代表的是myObj对象,所以这个地方returnthis.name也可以用return myObj.name 来代替的。让人迷惑的是在函数(类型)的定义中使用this,这个以后会讲到,我们现在先举个小例子:

functionmyType(){

    this.name = "my type";

}

varo = newmyType();// 监视o可以看到o.name = "my type",此时this代表的是对象o

 

//然后我们直接调用myType(),作为一个函数调用

myType();//监视window.name可以发现window.name = "my type",此时this代表window对象

 

//然后我们清空window.name ,并通过caller调用myType

window.name = undeifned; //监视发现window.name = undeifined

varcaller = {};

myType.call(caller);// 监视caller.name = "my type", window.name = undefined

如果有对call或者apply不熟悉的,可以查看下相关资料,此处不做深入描述。上边的例子我们大致可以看出,this在函数中真是代表什么,简而言之,就是调用者。直接在浏览器客户端调用,通常表示window,通过call,apply调用,则代表指定的调用对象,而实例化上作为方法使用,它的调用者就是实例化出来的对象。

需要说明的是,在客户端编程中,在事件或者setTimeInterval等中指定的obj.func,他们的调用者并不是obj,只是指定了一个委托而已。我曾经遇到过这样的问题,因此在这儿给说明下。

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,