MDN声明:
instanceof运算符测试了constructor.prototype的存在 对象的原型链。
// defining constructors
function C(){}
function D(){}
var o = new C();
// true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof C;
好的,让我们改变constructor
属性:
function Z() {}
o.constructor = Z;
o instanceof C; // still returns true
为什么?
答案 0 :(得分:1)
在句子中
instanceof运算符测试对象原型链中constructor.prototype的存在。
constructor
未提及constructor property on Object.prototype,而是提及right hand side parameter to the instanceof operator
设置o.constructor = Z
不会改变任何相关内容。您可以使用[[Prototype]]
或o
Reflect.setPrototypeOf
的{{1}}
演示Object.setPrototypeOf
:
instanceof
在此示例中,var proto = {}
var o = Object.create(proto)
function t() {}
t.prototype = proto
o instanceof t // --> true
必须是一个函数,因为spec定义它必须是可调用的。
您可能会看到ES2015中引入了t
运算符的新行为。 instanceof
符号现在可用于控制hasInstance
的行为。但如果未定义instanceof
,则使用旧行为。
使用hasInstance
符号,您可以创建一个"构造函数"对所有可能的对象返回true。
hasInstance