Javascript的对象 object(二)

内容纲要

对象的创建

已经说了许多了对象的话题了,但有一个很基本的问题我们忘了讨论,那就是:怎样建立对象?

在前面的示例中,我们已经涉及到了对象的建立了。我们使用了一种被称为JavaScript Object Notation(缩写JSON)的形式,翻译为中文就是“JavaScript对象表示法”。

JSON为创建对象提供了非常简单的方法。例如,

创建一个没有任何属性的对象:

var o = {}; 

创建一个对象并设置属性及初始值:

var person = {name: "Angel", age: 18, married: false}; 

创建一个对象并设置属性和方法:

var speaker = {text: "Hello World", say: function(){alert(this.text)}}; 

创建一个更复杂的对象,嵌套其他对象和对象数组等:

var company = 

{ 

name: "Microsoft", 

product: "softwares", 

chairman: {name: "Bill Gates", age: 53, Married: true}, 

employees: [{name: "Angel", age: 26, Married: false}, {name: "Hanson", age: 32, Marred: true}], 

readme: function() {document.write(this.name + " product " + this.product);} 

}; 

JSON的形式就是用大括“{}”号包括起来的项目列表,每一个项目间并用逗号“,”分隔,而项目就是用冒号“:”分隔的属性名和属性值。这是典型的字典表示形式,也再次表明了 JavaScript里的对象就是字典结构。不管多么复杂的对象,都可以被一句JSON代码来创建并赋值。

其实,JSON就是JavaScript对象最好的序列化形式,它比XML更简洁也更省空间。对象可以作为一个JSON形式的字符串,在网络间自由传递和交换信息。而当需要将这个JSON字符串变成一个JavaScript对象时,只需要使用eval函数这个强大的数码转换引擎,就立即能得到一个JavaScript内存对象。正是由于JSON的这种简单朴素的天生丽质,才使得她在AJAX舞台上成为璀璨夺目的明星。

JavaScript就是这样,把面向对象那些看似复杂的东西,用及其简洁的形式表达出来。卸下对象浮华的浓妆,还对象一个眉目清晰!

构造对象

好了,接下我们来讨论一下对象的另一种创建方法。

除JSON外,在JavaScript中我们可以使用new操作符结合一个函数的形式来创建对象。例如:

function MyFunc() {};         //定义一个空函数 

var anObj = new MyFunc();  //使用new操作符,借助MyFun函数,就创建了一个对象 

JavaScript的这种创建对象的方式可真有意思,如何去理解这种写法呢?

其实,可以把上面的代码改写成这种等价形式:

function MyFunc(){}; 

var anObj = {};     //创建一个对象 

MyFunc.call(anObj); //将anObj对象作为this指针调用MyFunc函数 

我们就可以这样理解,JavaScript先用new操作符创建了一个对象,紧接着就将这个对象作为this参数调用了后面的函数。其实,JavaScript内部就是这么做的,而且任何函数都可以被这样调用!但从 “anObj = new MyFunc()” 这种形式,我们又看到一个熟悉的身影,C++和C#不就是这样创建对象的吗?原来,条条大路通灵山,殊途同归啊!

君看到此处也许会想,我们为什么不可以把这个MyFunc当作构造函数呢?恭喜你,答对了!JavaScript也是这么想的!请看下面的代码:

“`
function Person(name) //带参数的构造函数
{
this.name = name; //将参数值赋给给this对象的属性
this.SayHello = function() {
alert("Hello, I'm " + this.name);
}; //给this对象定义一个SayHello方法。
};

<pre><code>function Employee(name, salary) //子构造函数
{
Person.call(this, name); //将this传给父构造函数
this.salary = salary; //设置一个this的salary属性
this.ShowMeTheMoney = function() {
alert(this.name + " $" + this.salary);
}; //添加ShowMeTheMoney方法。
};

var BillGates = new Person("Bill Gates"); //用Person构造函数创建BillGates对象
var SteveJobs = new Employee("Steve Jobs", 1234); //用Empolyee构造函数创建SteveJobs对象

BillGates.SayHello(); //显示:I'm Bill Gates
SteveJobs.SayHello(); //显示:I'm Steve Jobs
SteveJobs.ShowMeTheMoney(); //显示:Steve Jobs $1234

alert(BillGates.constructor == Person); //显示:true
alert(SteveJobs.constructor == Employee); //显示:true

alert(BillGates.SayHello == SteveJobs.SayHello); //显示:false
“`

这段代码表明,函数不但可以当作构造函数,而且还可以带参数,还可以为对象添加成员和方法。其中的第9行,Employee构造函数又将自己接收的this作为参数调用Person构造函数,这就是相当于调用基类的构造函数。第21、22行还表明这样一个意思:BillGates是由Person构造的,而SteveJobs是由Employee构造的。对象内置的constructor属性还指明了构造对象所用的具体函数!

其实,如果你愿意把函数当作“类”的话,她就是“类”,因为她本来就有“类”的那些特征。难道不是吗?她生出的儿子各个都有相同的特征,而且构造函数也与类同名嘛!

发表评论

您的电子邮箱地址不会被公开。