JavaScript对象的创建方式
在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式。对象字面量是一种灵活方便的书写方式,例如:
var o1 = {
p:”I’m in Object literal”,
alertP:function(){
alert(this.p);
}
}
这样,就用对象字面量创建了一个对象o1,它具有一个成员变量p以及一个成员方法alertP。这种写法不需要定义构造函数,因此不在本文的讨论范围之内。这种写法的缺点是,每创建一个新的对象都需要写出完整的定义语句,不便于创建大量相同类型的对象,不利于使用继承等高级特性。
new表达式是配合构造函数使用的,例如new String(“a string”),调用内置的String函数构造了一个字符串对象。下面我们用构造函数的方式来重新创建一个实现同样功能的对象,首先是定义构造函数,然后是调用new表达式:
function CO(){
this.p = “I’m in constructed object”;
this.alertP = function(){
alert(this.p);
}
}
var o2 = newCO();
那么,在使用new操作符来调用一个构造函数的时候,发生了什么呢?其实很简单,就发生了四件事:
var obj ={};
obj.__proto__ = CO.prototype;
CO.call(obj);
return obj;
第一行,创建一个空对象obj。
第二行,将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象,这是最关键的一步,具体细节将在下文描述。
第三行,将构造函数的作用域赋给新对象,因此CA函数中的this指向新对象obj,然后再调用CO函数。于是我们就给obj对象赋值了一个成员变量p,这个成员变量的值是” I’min constructed object”。
第四行,返回新对象obj。当构造函数里包含返回语句时情况比较特殊,这种情况会在下文中说到。
PS:相对于普通函数,构造函数中的this是指向实例的,而普通函数调用中的this是指向windows的。
作为直接调用对象时,它会执行这个function并得到相应的返回值。
function makeGamePlayer(name,totalScore,gamesPlayed) {
var obj = {
name: name,
totalScore: totalScore,
gamesPlayed: gamesPlayed
}
return obj;
}
var player = makeGamePlayer("John Smith", 15, 3);
在这种情况下,不加 return 会返回 undefined,return this 返回 window 对象。
作为实例化对象时:
function makeGamePlayer(name,totalScore,gamesPlayed) {
this.name = name;
this.totalScore = totalScore;
this.gamesPlayed = gamesPlayed;
}
var player = new GamePlayer("John Smith", 15, 3);
在这种情况下,return this和不加return是一样的,返回的都是实例本身。
构造函数中的return
构造函数中如果加入了return的话,分两种情况
function Foo(name,age){
this.name=name;
this.age=age;
return {name:"Jeff"}
}
var foo=new Foo("Tom",14);
foo.name;//Jeff
return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。这种情况下,忽视return值,依然返回this对象。
return的是Object。 这种情况下,不再返回this对象,而是返回return语句的返回值。