js中构造函数创建对象加不加new的问题

本文中将探讨一下,用函数生成对象时候加new 与不加new 的区别。首先看下面一个函数代码块。

    function Student(name, age, gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.sayHi = function () {
            console.log("hello" + this.name );
        }
	console.log(this);
    }

如果,我们使用 var stu1 =  Student("zs", 18, "gender");等同于执行了Student 函数,在此种情况,函数内部的this,指向的是window ,函数执行过后,并没有返回值,那么就默认返回一个undefined.所以如果console.log(stu1),那么将得到一个undefined值。同时可以看到控制台中,window对象中,挂载了name,age,gender,sayHi等变量。


在使用var stu1 =  new  Student("zs", 18, "gender");加入一个new ,那么通过函数内部的console.log(this)可以看到,该this 指向了当前的stu1。console.log(stu1)可以看到。两只完全相等。


关于其中__proto__的含义,涉及到js面向对象部分,我们常见的jquery, angular,react,无不用到js面向对象的知识。如果新手,不了解js的学习的先后顺序,直接上手框架部分,就如同学过java基础过后,不用学习servlet,直接学习后面的框架一样。到时候,只是能用,对自己提高不明显。

继续上面的补充,请看以下代码片段:

    function Num(value) {
        this.value = parseInt(value);
        var num = parseInt(value);
        return num;//如果是值类型就不返回了 如果是引用类型还返回
    }
    var num1 = Num("18");
    var num2 = new Num("18");

    console.log(num1);
    console.log(num2);
关于return 的内容,对于 不加new 来执行函数来说,返回值,就是函数的执行结果,对于加new 关键字来执行函数而言,如果return 的是基本数据类型,那么忽视掉该return值,如果返回的是 一个对象类型,那么num2就指向该对象类型。上面的执行结果为:


如果上面代码块改为:

    function Num(value) {
        this.value = parseInt(value);
        var num = parseInt(value);
	console.log(this)
        return {name:'zs'};//如果是值类型就不返回了 如果是引用类型还返回
		
    }
    var num = new Num("18");

    console.log(num);

那么执行结果为:


可以看到return 前打印的this,和return后的num对象差距挺大。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值