第一个问题是我在采访中被问到的,说实话,我看到自己真的很困惑并且出现了门,
考虑一下片段:
案例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
答案 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
:
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;
答案 3 :(得分:0)
您陷入此陷阱的陷阱是您假设instanceof运算符是可传递的。你写了
ins <-- myFunction <-- Function <-- Object
并得出结论,它也认为
ins <-- Function
碰巧是真的
myFunction <-- Object
但这不是由于传递的实例。
事实上,例如,如果a instanceof b
和b.prototype instanceof c
遵循a instanceof c
,则不需要b instanceof c
。看看这个例子:
function func() {}
function superFunc() {}
func.prototype = new superFunc();
var x = new func();
现在,x
是func
和superFunc
的实例,但func
不是superFunc
的实例。在其他语言中,您宁愿说func
是superFunc
的子类。