new运算的具体执行过程

new运算的具体执行过程

function Person(name,age){
   this.name = name;
   this.age = age;
   console.log(this);
}
  var p1 = new Person("小明","20");
  console.log(p1);

1.创建一个空对象

var obj = new Object();

2.让Person中的this指向obj,并执行Person的函数体

var result = Person.call(obj);

3.设置原型链,将obj的__proto__成员指向了Person函数对象的prototype成员对象

obj.proto = Person.prototype;

4.判断Person的返回值类型,如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。

if (typeof(result) == "object"){
 	 person = result;
}else{
	 person = obj;
}
  • 例子
  var A = {n:4399};
  var B = function(){
   this.n = 9999;
  };
  var C = function(){
   var n = 9999;
  }
  B.prototype = A;
  C.prototype = A;
  var b = new B();
  var c = new C();
  A.n++;
  console.log(b.n);
  console.log(c.n);
  • B.prototype = A;
    C.prototype = A;
    改写了B,C指向的原型对象,指向了A,因此B,C拥有属性 n:4399

  • var b = new B();
    var c = new C();
    1)创建了新的实例对象:b,c
    2)让B,C中的this指向b,c,所以b.n = 9999
    3)执行构造函数的代码,给实例添加属性。此时执行b.n = 9999,为b添加实例属性
    执行var n = 8888,对实例c没有影响。
    4) 返回新对象。
    返回实例对象b,拥有实例属性n=9999,通过原型链,具有原型属性n:4399
    返回实例对象c,只有原型属性n=4399;

  • A.n++
    然后改写原型的属性A.n,因为原型上的属性是公用的,所有b和c中原型上的n属性都为4400,
    b还有实例属性n=9999;
    查找属性的时候,先在实例上找,再去原型中找,但是只要找到了就不会再往后找了
    于是 b.n = 9999(实例中)
    c.n = 4400(原型中)

若不理解原型对象和原型链可以看我的另外一个文章
https://blog.csdn.net/qq_43553067/article/details/88065862
参考:https://blog.csdn.net/zhouziyu2011/article/details/60143385

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值