美文网首页
JS 操作符优先级及new

JS 操作符优先级及new

作者: _v_xw | 来源:发表于2017-09-21 11:30 被阅读0次

基于segmentfault上的一道题

题目

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 ();       // 第三种
    
  • 首先先了解下优先级(由高到低)


    MDN

由此可以知道new 的优先级带参数的比不带的高

解析

  • 第一种
    new foo.getName (); '.'的优先级比new高
    所以先执行foo.getName,在来执行new
    也就是new (foo.getName) () // 返回一个foo.getName的实力 获得就是2
  • 第二种
    new foo().getName (); 主要犹豫的地方是先foo()函数运算还是先new
    foo()先new (foo().getName)()
    new 先 (new foo()).getName()
    如果new 不带参数的优先级确实比函数调用的优先级低,但现在new是带参数的所有优先级
    所以执行的 (new foo()).getName() // foo()上的getName方法,但是没有这个方法所以去原型上找,结果为3
  • 第三种
    new new foo().getName (); 从上面分析得,new带参数会优先执行,这是在从左至右的运算基础下实现的
    也就是第一步new (new foo().getName)()
    第二步 new ((new foo()).getName)()
    最后进行运算 先计算new foo(), 在获取getName,在对获取内容进行new ()计算
    new ((new foo()).getName)() 也就是 new (foo.prototype.getName)()
    返回的就是3, 具体可以看下面new 原理解析

new原理

在第三种解析中我们要计算 new (foo.prototype.getName)()的值,首先要明白new到底做了什么,其实就做了3件事

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一步:创建一个空对象
第二步:绑定该对象的原型
第三部:调用构造函数 // 执行了构造函数的内容
所以在 new (foo.prototype.getName)()也就会返回foo.prototype.getName的一个实例,并且执行一次构造函数,也就是执行console.log(3),打印3这个结果

相关文章

  • JS 操作符优先级及new

    基于segmentfault上的一道题 题目 首先先了解下优先级(由高到低)MDN 由此可以知道new 的优先级带...

  • JS基础回归01:new操作符,原型和原型链

    本篇介绍 new 操作符的背后原理以及 JS 如何依赖原型形成原型链,完成继承。 new 操作符的本质 new 操...

  • 关于 new 操作符

    1. 为什么要有new操作符? JS 的 new 到底是干什么的? 本文指出,new 操作符其实就是个语法糖,用了...

  • new操作符

    最近在掘金上看到大佬 yck 的文章 重学 JS 系列:聊聊 new 操作符把new操作符的作用,如何自己实现ne...

  • js面试题--new的原理

    JS中的new操作符 和其他高级语言一样,JS中也有new运算符,我们知道new运算符是用来实例化一个类,从而在内...

  • js new操作符

    简单实现 其实new操作符实现还是很简单的,因为Mdn上总共也就是4句话来描述它的作用 创建一个空的简单JavaS...

  • new操作步骤

    js中的new()到底做了些什么?? 要创建 Person 的新实例,必须使用 new 操作符。以这种方式调用构造...

  • 四、MySQL常用函数

    操作符优先级 • 下图展示了所有操作符的执行优先级,从高到低,同一行中的操作符优先级相同,相同优先级的情况下则从左...

  • C++ 网易面试题“让new操作符不分配内存,只调用构造函数”

    问题 c++中的new操作符通常完成两个工作分配内存及调用相应的构造函数。请问:1)如何让new操作符不分配内存,...

  • C++ “让new操作符不分配内存,只调用构造函数”

    问题 c++中的new操作符通常完成两个工作分配内存及调用相应的构造函数。请问:1)如何让new操作符不分配内存,...

网友评论

      本文标题:JS 操作符优先级及new

      本文链接:https://www.haomeiwen.com/subject/qglzsxtx.html