要知道这个问题,需要知道new的过程发生了什么?终于在( js高级程序设计第三版)给出了答案:
1.创建一个空对象
2.将这个空对象的原型,指向构造函数的prototype属性,构造函数中的this指向这个空对象
3.开始执行内部的代码。
4.如果该函数没有返回 对象 ,则返回this
对第四点我要补充一点:因为有个关键字大家容易遗漏,就是 对象 这两个字,这意味着如果返回的是基本数据类型,比如:int ,string, 那么使用new 最后返回的还是this,这个对象,而不是基本数据类型,这是一个非常容易被遗漏的地方。
其他例子就不多说了,再补充两点总结:
小结:
1. 没有new的构造函数就是一个普通函数,this指向的window,返回值就是构造函数的返回结果。并且不管return的是基本数据类型还是引用类型,都会原样返回。
2. 有new的构造函数,默认返回this,而this指向实例化的对象。并且如果return的是基本数据类型,那么忽视掉该return值,如果返回的是一个引用类型,那么返回该引用类型。
个人觉得主要是过程不同:
一个是构造对象、一个是函数调用。
function b() {this.p = 1
this.p1 = 2
}
var a = new b()
a.p // 1
a.p1 //2
var c = b()
c.p // 报错
c.p1 // 报错
new:
实际上a的__proto__成员指向了b对象prototype成员对象,然后b函数对象的this指针替换成a,然后再调用b函数(),这时候的a里面的this变成了a自己,所以a拥有p和p1
a.__proto__=b.prototypeb.call(a)
function b() {
a.p = 1
a.p1 = 2
}
new 会创建 pre 的对象,
但是没有 new 的话就没有没有可返回的值或对象了,所以是 undefined。
如果不想new 新的对象的话,可以在 pre 的方法里 返回一个值或对象。
function pre(){this.radius = Math.random()
return this.radius
}