JS构造函数中 this 和 return

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语句的返回值。

原文地址:https://www.cnblogs.com/bq-med/p/8808927.html