对JavaScript里面new关键字的理解

我们先来看下面一段代码:
var i = 0;
(function () {
    var fun =function() {
       this.member1= 1;
      console.log("this:", this);
       if (i == 0){
          this.member2= "增加成员2";
       } else{
          this.member3= "增加成员3";
       }
       i++;
    };

    fun.member ="member";

    var fun1 =new fun;
    var fun2 =new fun;
   console.log("fun:", fun);
   console.log("fun1:", fun1);
   console.log("fun2:", fun2);

   console.log("fun === fun.prototype.constructor:", fun ===fun.prototype.constructor);
})();


上述代码的结果如下:


我们可以看出:
  1. 对于fun.member ="member",这个操作是对fun对象增加键值对,这个fun的对象成员,不能被当做类成员看待,所以fun1和fun2里面都没有member这个成员;
  2. JavaScript中的new关键字,其作用与Java中的new如出一辙,都将做如下三项基本工作:
  • 在系统堆中,申请该类的所有“非静态”成员空间,即,实例空间;
  • 在系统“堆栈”,申请一个指针空间(对象空间、局部变量),并将上述空间的首地址赋值给这个指针(对象),而这个指针又被另起外号为“this”;
  • 对被实例化的对象的所有“非静态”赋初值,而这就是构造方法(函数)的功能;
因此,在执行new操作的时候,将执行fun.prototype.constructor构造函数,对于var fun1 = newfun,这里的this其实就是fun1;var fun2 = new fun,这里的this其实就是fun2。
根据上述说法,所对应的输出结果,就非常合理了。

对于console.log("fun === fun.prototype.constructor:", fun ===fun.prototype.constructor),程序的输出结果为:


说明,在js中,类都由一个constructor函数,这个函数直接指向类(函数本身)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值