1,第一种new对象没有加()没有见过,为什么调用的本身的方法?
2第三种双new是什么原理,和单个new有什么区别吗?
这里出现了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 一个实例时,运行的一个方法 ,仅供参考 :
function A(){
this.a= 1;
this.aa=11;
}
A.prototype={
c:function(){console.log(this.a);}
}
function ne(func){//模仿 new 产生实例
var obj = {};
func.call(obj);
obj.__proto__ = {};
for(var param in func.prototype){
obj.__proto__[param] = func.prototype[param];
};
return obj;
}
var a = ne(A);
console.log(a);
var newA = new A();
console.log(new A);
可以比较下,这两个对象基本差不多
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
首先要明确的是new也是一个一元操作符。
类推一下: