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”的值。