我正在尝试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
做了什么导致这种行为?
首先,我建议查看有关新运算符的文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
具体来说,请注意
执行代码new Foo(...)时,会发生以下情况:
- 创建一个新对象,继承自Foo.prototype。
- 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等同于新的Foo(),即如果没有指定参数列表,则不带参数调用Foo。
- 构造函数返回的对象将成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。 (通常构造函数不返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)
通过显式返回f
,您将覆盖正常的创建过程。当你使用instanceof
时,你会问“是n和f的实例”。不是。是f。它本身并不是一个例子。
因为显然f
是一个函数,并且n === f
,当你试图确定它们是否是函数时,两者都将返回true。另外,在Javascript中,函数本身就是对象(就像数组一样),这就是new f() instanceof Object
为真的原因。
您将从构造函数返回f
。 f
是构造函数。所以你的构造函数永远不会构造一个实例,你只是在测试构造函数是否是它自己的一个实例。根据定义,它不是。
通过返回f
,你返回的函数,它不是f
的实例,因为它缺少与new
的调用。
function f() { return f; }
console.log(new f() === f);