好了,接下我们来讨论一下对象的另一种创建方法。
除 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 当作构造函数呢?恭喜你,答对了!JavaSc
ript 也是这么想的!请看下面的代码:
function Person(name) //带参数的构造函数
{
this.name = name; //将参数值赋给给this 对象的属性
this.SayHello = function() {alert("Hello, I'm " + this.name);}; //给this
对象定义一个SayHello 方法。
};
function Employee(name, salary) //子构造函数
{
Person.call(this, name); //将this 传给父构造函数
this.salary = salary; //设置一个this 的salary 属性
this.ShowMeTheMoney = function() {alert(this.name + " $" + this.salar
y);}; //添加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