如果是JavaScript中的函数,则为instanceof

时间:2015-09-03 06:26:34

标签: javascript

第一个问题是我在采访中被问到的,说实话,我看到自己真的很困惑并且出现了门,

考虑一下片段:

案例a:

    var sayHello = new Function("alert('Hello there');");
    alert(sayHello instanceof Function);            // true 
    alert(sayHello instanceof Object);              // true, since every 
                                                    // object inherits from Object

案例b:

    var myFunction = function(){

    }

    var ins = new myFunction();              
    alert(ins instanceof myFunction);        // ofcourse, true
    alert(myFunction instanceof Function);   // true

    alert(ins instanceof Function);          // false, Why is this not true?

根据我的理解, 功能 必须位于 原型链 中插件

ins <-- myFunction <-- Function <-- Object

4 个答案:

答案 0 :(得分:10)

您似乎在Javascript中错误解释了new

new myFunction()

不会创建该函数的新实例。而是创建一个新对象,它继承自myFunction.prototype并调用myFunction,将对象作为this传递给函数。

因此,您还没有真正创建函数的新实例,ins不是函数。您可以通过尝试假装它来轻松验证它:

var myFunction = function(){

}

var ins = new myFunction(); 

ins(); <-- error, ins is not a function

由于它不是一个函数,为什么你期望Function在它的原型链中呢?

答案 1 :(得分:3)

所以,你把它关闭了,但并不完全。原型链实际上如下:

ins <-- myFunction.prototype <-- Object

如您所见,ins对象继承自特定的函数原型,而不是直接来自Function。

因此,本质上ins不是myFunction的实例,而是myFunction.prototype的实例。

可以更清楚地显示这一点,因为当您向myFunction.prototype添加函数时,它们会在创建后附加到对象的实例。

有关确切情况的最佳信息来源,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new这完全解释了这种行为。

答案 2 :(得分:1)

ins不是instanceof Function,因为您将其声明为实例(new myFunction)。所以,它是myFunction的instance

只需参考myFunction

&#13;
&#13;
var myFunction = function(){};
var res = document.querySelector('#result');
var ins = myFunction;              
res.textContent = ['ins instanceof myFunction: ',ins instanceof myFunction,
                   '\nmyFunction instanceof Function: ', myFunction instanceof Function,
                   '\nins instanceof Function: ', ins instanceof Function].join('');
&#13;
<pre id="result"></pre>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您陷入此陷阱的陷阱是您假设instanceof运算符是可传递的。你写了

ins <-- myFunction <-- Function <-- Object

并得出结论,它也认为

ins <-- Function

碰巧是真的

myFunction <-- Object

但这不是由于传递的实例。

事实上,例如,如果a instanceof bb.prototype instanceof c遵循a instanceof c,则不需要b instanceof c。看看这个例子:

function func() {}
function superFunc() {}
func.prototype = new superFunc();

var x = new func();

现在,xfuncsuperFunc的实例,但func不是superFunc的实例。在其他语言中,您宁愿说funcsuperFunc子类