我正在尝试instanceof
运算符。我尝试了这样的事情。
function f(){ return f; }
new f() instanceof f;
// false
当它们是false
时为什么会变成true
function f(){ return f; }
new f() instanceof Function;
// true
function f(){ return f; }
new f() instanceof Object;
//true
当试图将其保存到变量中时,结果仍然相同
function f(){ return f; }
var n = new f();
n instanceof f;
// false
n();
// function f()
n() instanceof f;
// false
n instanceof Function // true
n() instanceof Function // true
为什么return f;
语句更改了所有内容?
return f
做了什么导致这种行为?
答案 0 :(得分:6)
首先,我建议您查看有关新运算符的文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
请特别注意
执行代码new Foo(...)时,会发生以下情况:
- 创建一个新对象,该对象继承自Foo.prototype。
- 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等同于new Foo(),即,如果未指定参数列表,则调用Foo时不带参数。
- 构造函数返回的对象成为整个新表达式的结果。如果构造函数未明确返回对象,则使用在步骤1中创建的对象。 (通常,构造函数不返回值,但是如果他们想覆盖普通的对象创建过程,则可以选择这样做。)
通过显式返回f
,您将覆盖正常的创建过程。使用instanceof
时,您要问“是n和f的实例”。不是。 是。它不是自身的实例。
由于显然f
是一个函数,而n === f
则在您尝试确定它们是否是函数时都将返回true。另外,在Javascript中,函数本身就是对象(与数组一样),这就是new f() instanceof Object
为真的原因。
答案 1 :(得分:3)
您正在从构造函数中返回f
。 f
是的构造函数。因此,您的构造函数永远不会构造实例,而您只是始终在测试构造函数是否为其自身的实例。根据定义,不是。
答案 2 :(得分:2)
通过返回f
,您将返回该函数,该函数不是f
的实例,因为它缺少对new
的调用。
function f() { return f; }
console.log(new f() === f);