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