函数在JavaScript中时的instanceof
采访中我被问到的第一个问题,老实说,我看到自己真的很困惑,于是就开门了 考虑以下代码片段: 案例a: 案例b: 根据我的理解,函数必须位于ins的原型链中函数在JavaScript中时的instanceof,javascript,Javascript,采访中我被问到的第一个问题,老实说,我看到自己真的很困惑,于是就开门了 考虑以下代码片段: 案例a: 案例b: 根据我的理解,函数必须位于ins的原型链中 ins <-- myFunction <-- Function <-- Object insins不是函数的instanceof,因为您将其声明为实例(new myFunction)。因此,它是myFunction的一个实例 只需参考myFunction: var myFunction=function(){}; var
ins <-- myFunction <-- Function <-- Object
insins
不是函数的instanceof
,因为您将其声明为实例(new myFunction
)。因此,它是myFunction的一个实例
只需参考myFunction
:
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,
“\n ins instanceof函数:”,ins instanceof函数].join(“”)代码>
所以,你已经很接近了,但还不是很接近。原型链实际上如下所示:
ins <-- myFunction.prototype <-- Object
ins您似乎误解了Javascript中的new
不创建函数的新实例。相反,它创建一个新对象,该对象继承自myFunction.prototype
,并调用myFunction
,将对象作为this
传递给函数
因此,您没有真正创建函数的新实例,您的ins
不是函数。您可以很容易地通过假装它是:
var myFunction = function(){
}
var ins = new myFunction();
ins(); <-- error, ins is not a function
var myFunction=function(){
}
var ins=new myFunction();
ins() 这里的陷阱是假设instanceof操作符是可传递的。你写
ins <-- myFunction <-- Function <-- Object
现在,x
是func
和superFunc
的实例,但是func
不是superFunc
的实例。在其他语言中,你宁愿说func
是superFunc
的子类,ins
甚至不是函数ins
是一个对象,不是函数,你不能在这里调用ins()
)@Wouter:但在这一点上,每个函数都必须从对象继承。@ShirgillAnsari:每个函数都从对象继承,true,但不是每个对象都是函数。在这种情况下,情况并非如此myFunction
是一个构造函数,对它调用new
会创建一个不是函数的新对象。@major:我不同意“因此,ins不是myFunction的实例”这句话。显然是的。@ShirgillAnsari我只是想指出,myFunction.prototype
是原型链的终点,而不是直接的myFunction
,这让我松了一口气。
new myFunction()
var myFunction = function(){
}
var ins = new myFunction();
ins(); <-- error, ins is not a function
ins <-- myFunction <-- Function <-- Object
ins <-- Function
myFunction <-- Object
function func() {}
function superFunc() {}
func.prototype = new superFunc();
var x = new func();