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

我们先从最常见的说起,

var o = new Object()

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

var o = new TypeDef()

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

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

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

var json1 = {};//和json1 = new Object();的结果是一样的 
var json2 = {
    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完整定义一个:

var myObj = {
    name: "my object",
    howToDefined: "Json",
    showMyName: function(){
        return this.name;
    }
}

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

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

function myType(){
    this.name = "my type";
}
var o = new myType();// 监视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
var caller = {};
myType.call(caller);// 监视caller.name = "my type", window.name = undefined

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

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

作者: 微夜风 发表于 2011-07-28 00:12 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"