以下这道js题是什么原因?

第 17 题

function f(){
    return f;
}
console.log(new f() instanceof f);

解析:

//输出false
阅读 1.8k
3 个回答

new并不总是返回实例——如果你return一个非原始值对象
所以new f()返回的是函数f。它的原型当然不是f了

用以下几个例子来对比就很清晰了:

function f(){ return f;}
Object.getPrototypeOf(new f()).constructor
//输出 ƒ () { [native code] }

function f() {this.a = 1;return 1}
Object.getPrototypeOf(new f()).constructor
//输出 ƒ f() {this.a = 1;return 1}

function f() {this.a = 1;return {name:"a"}}
Object.getPrototypeOf(new f()).constructor
//输出 ƒ Object() { [native code] }

new 关键字会进行如下的操作:

  1. 创建一个空的简单JavaScript对象(即**{}**);
  2. 链接该对象(即设置该对象的构造函数)到另一个对象 ;
  3. 将步骤1新创建的对象作为**this**的上下文 ;
  4. 如果该函数没有返回对象,则返回**this**

摘自 MDN new

当构造函数有返回值是一个对象的时候,使用关键词new实例化的对象,就是构造函数返回的东西。因此你的new f()的结果是构造函数f本身,肯定不是f的实例

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