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

  • 相关阅读:
    收藏好博客
    iOS设备的重力感应
    局域网内通过UDP协议进行传输接受数据——AsyncUdpSocket
    定时器NSTimer的用法
    线程数:5,ramp-up:1,循环::10 和 线程数:10,ramp-up:10,循环数:1,这两种情况有没有区别?
    什么是性能测试?
    JMeter 之 XPath提取器
    DNS--安装&&配置文件
    DNS--简介&&解析过程
    Tomcat--隐藏版本号
  • 原文地址:https://www.cnblogs.com/bq-med/p/8808927.html
Copyright © 2020-2023  润新知