首页 > js使用new的疑问?

js使用new的疑问?

1,第一种new对象没有加()没有见过,为什么调用的本身的方法?
2第三种双new是什么原理,和单个new有什么区别吗?


你可以百度一下,js new 都干了什么


首先要明确的是new也是一个一元操作符。
类推一下:

var temp = {x: 0};
++temp.x;

/*
*优先读取属性,再进行一元++,
*所以new aa.getName()相当于创建了一个以aa.getName为构造函数的实例并输出3
*
*而new aa().getName()相当于new Date().valueOf(),
*先执行了new aa()返回aa的实例,再调用实例的方法,输出2,没有创建实例,
*
*而第三个new new aa().getName()相当于先执行了new aa()返回aa的实例,
*再以此实例的方法getName为构造函数创建实例并输出2
*/

这里出现了2种表达式
1.new对象创建表达式,new操作符的后面可以是一个对象属性访问表达式,要求这个对象属性访问表达式的求值结果为一个构造函数,或是直接是一个构造函数;如果构造函数定义是没有声明参数,最后的()可以省略
2.对象属性访问表达式,函数也是一个对象
3.在一个复杂表达式中,子表达式从左往右依次计算各个子表达式的值

function aa(){
    getName=function(){
        console.log(1);//[1]
    }
    return this;
}
aa.prototype.getName=function(){
    console.log(2);//[2]
};

aa.getName=function(){
    console.log(3);//[3]
};

new aa.getName();//[A]

new aa().getName();//[B]

new new aa().getName();[C]

对于[A]
aa.getName是一个属性访问表达式,其求值结果为一个函数对象
new aa.getName(); ==>

var tempFun=aa.getName;//[3]
new tempFun();

[B]
new aa()是一个对象创建表达式
new aa().getName(); ==>

var aaInstance=new aa();
aaInstance.getName();//[2]

[C]
有点复杂了
第1个new后面是一个属性访问表达式‘’‘new aa().getName’‘’,而这个表达式又包含了一个new对象创建表达式
new aa()及一个后续的属性访问表达式,求值后再作为new操作符的构造函数执行对象创建

new new aa().getName(); ==>

var aaInstance=new aa();
var tempFun=aaInstance.getName;
new tempFun();//[2]

总结下
如果new操作符后,能够直接找到 构造函数()这样的语句形式的,那么new对象创建表达式就成立,就可以马上求值,否则就将后面全部整体一个表达式去求值,检查器结果是否是一个构造函数,如果是,那么new表达式就可以正确执行,否则抛出typeError


第一个
new 【aa.getName()】
第三个
【new 【new aa()】.getName()】

我觉得应该是这样

【热门文章】
【热门文章】