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

  • 相关阅读:
    TOJ 2776 CD Making
    int型、long型和long long型
    Hadoop HA- hadoop集群部署
    大数据之路- Hadoop环境搭建(Linux)
    Hadoop HA- zookeeper安装配置
    Zookeeper- Error contacting service. It is probably not running解决方案和原理
    大数据- 自定义Log4j日记
    Hadoop- Hadoop环境搭建
    域名解析
    JAVA- JDBC之DBHelper
  • 原文地址:https://www.cnblogs.com/bq-med/p/8808927.html
Copyright © 2020-2023  润新知