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

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

844人阅读 评论(0) 收藏 举报

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

[javascript] view plain copy
print ?
  1. function Student(name, age, gender) {  
  2.     this.name = name;  
  3.     this.age = age;  
  4.     this.gender = gender;  
  5.     this.sayHi = function () {  
  6.         console.log("hello" + this.name );  
  7.     }  
  8. sole.log(this);  
  9. }  
    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,直接学习后面的框架一样。到时候,只是能用,对自己提高不明显。

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

[javascript] view plain copy
print ?
  1. function Num(value) {  
  2.     this.value = parseInt(value);  
  3.     var num = parseInt(value);  
  4.     return num;//如果是值类型就不返回了 如果是引用类型还返回  
  5. }  
  6. var num1 = Num("18");  
  7. var num2 = new Num("18");  
  8.   
  9. console.log(num1);  
  10. console.log(num2);  
    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就指向该对象类型。上面的执行结果为:


如果上面代码块改为:

[javascript] view plain copy
print ?
  1. function Num(value) {  
  2.     this.value = parseInt(value);  
  3.     var num = parseInt(value);  
  4. sole.log(this)  
  5.     return {name:'zs'};//如果是值类型就不返回了 如果是引用类型还返回  
  6.   
  7. }  
  8. var num = new Num("18");  
  9.   
  10. console.log(num);  
    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对象差距挺大。




0
0
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值