JS构造函数加new与不加new的区别?

JavaScript017

JS构造函数加new与不加new的区别?,第1张

要知道这个问题,需要知道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.prototype

b.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

}