js操作符优先级

 function foo() {
    getName = function () { console.log (1); };
    return this;
}
foo.getName = function () { console.log(2);};
foo.prototype.getName = function () { console.log(3);};
var getName = function () { console.log(4);};
function getName () { console.log(5);}
new foo.getName ();            // 
new foo().getName ();          // 
new new foo().getName ();      // 
    

这里的优先级是怎么样的,我查了优先级表,上面说new带参数列表的比不带参数列表的优先级高, 然后new 带参数列表的和成员操作符的优先级相同,有点晕了,比如最后三条语句这个优先级是怎么样的,能有大神帮忙解释一下吗

阅读 3.5k
4 个回答

没太懂你所说的参数列表具体指的是什么。

new foo.getName();

这句是以foo.getName为构造函数创建对象。

new foo().getName();

这句是foo为构造函数创建对象,并且调用其getName方法。

new new foo().getName ();

这句是先以foo为构造函数创建对象A,再以A.getName为构造函数创建对象,也就是相当于是

new (new foo()).getName ();

运算符含有优先级,操作符没有
clipboard.png
JS是从上往下执行,从左到右
可以看出只执行了
new foo.getName() //2
new foo().getName() //3
new new foo().getName() //3

这道题和优先级没有关系,js虽然是异步执行,但是代码也是从上到下执行,而楼主所发出的代码都是同步任务,至上而下执行,都在主线程内执行。所以是分别按顺序执行

1.new foo.getName ()
执行的是foo.getName这个构造函数,即执行这个函数

foo.getName = function () { console.log(2);};

2.new foo().getName()
foo作为构造函数执行,返回foo的实例,实例本身并没有getName方法,则会按照原型链机制,查找实例本身__proto__属性中的属性,__proto__即是指向foo的原型对象foo.prototype,所以这行执行的是

foo.prototype.getName = function () { console.log(3);};

3.new new foo().getName()
相当于new (new foo().getName), 把第2点中的foo.prototype.getName作为构造函数再执行了一遍

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题