0
点赞
收藏
分享

微信扫一扫

new运算的具体执行过程

尤克乔乔 2021-09-19 阅读 74

1)创建一个空对象
2)把这个空对象的proto指向构造函数的prototype
3)把这个空对象赋值给this
4)执行构造函数内的代码,注意此时的this指向新对象,this.n=9999 等价于b.n=9999;

案例:

var A={n:4399};
var B=function () {
  this.n=9999;
};
var C=function(){
  var n=8888
};
B.prototype=A;
C.prototype=A;
var b=new B();
var c=new C();
A.n++;
console.log(b.n);//9999
console.log(c.n);//4400

代码解读:
console.log(b.n),在查找 b.n 是首先查找 b 对象自身有没有 n 属性,如果没有会去原型(prototype)上查找,当执行 var b = new B() 时,函数内部 this.n=9999(此时this指向b) 返回b对象,b对象有自身的n属性,所以返回 9999,console.log(c.n)同理;当执行 var c = new C() 时,c对象没有自身的n属性,向上查找,找到原型 (prototype)上的 n 属性,因为 A.n++(此时对象A中的n为4400), 所以返回4400

补充:

var c = new C();

上面这个语句的实际运行过程是这样的。

var c = function() {
  var o = new Object();
  //第一个参数改变函数的作用域,即相当于在函数内部设置this = o
  C.apply(o, argumens);
  return o;
}

这样,由于C()函数中

var n = 8888;

这样只是在函数中创建了一个私有变量,并没有为对象执行任何操作,因此C的实例中不存在名字为“n”的属性。所以,c.n会访问原型中的属性名为“n”的值。

举报

相关推荐

0 条评论