注意:isPrototypeOf不同于 instanceof运算符。在表达中 对象实例的功能, 对象原型链被检查 反对AFunction.prototype,而不是 反对禁令本身
好的,我真的没有得到他们想要告诉我们的内容。问题object instanceof AFunction
与`AFunction.prototype.isPrototypeOf(object)不完全相同吗?或者我错了吗?
为什么我们需要isPrototypeOf
?
如果我需要做p.isPrototypeOf(o)
,我不能只做o instanceof p.constructor
?
另外,p.isPrototypeOf(o)
在功能上等同于p===Object.getPrototypeOf(o)
?
答案 0 :(得分:15)
对象构造函数是时髦的东西。来自this answer:
Pointy指出,in his answer
“构造函数”属性是一个 引用创建的函数 对象的原型,而不是对象 本身。
解决这个问题的通常方法是 增加对象的原型 分配后的
constructor
属性 到prototype
。
对象的构造函数不是只读的,这就是为什么可以这样做的原因。在p.constructor
创建后,我可以为p
分配任何值,这将完全打破使用
o instanceof p.constructor
而不是
p.isPrototypeOf(o)
constructor
@ MDC 编辑 re:OP编辑
另外,
p.isPrototypeOf(o)
在功能上等同于p===Object.getPrototypeOf(o)
?
除了在JavaScript 1.8.1之前没有引入Object.getPrototypeOf
的事实之外,这些问题比原始问题更相似吗?见John Resig - Object.getPrototypeOf
。也许更相关,这两个函数在the spec中是不同的! (警告,PDF链接)
答案 1 :(得分:7)
我认为这里最重要的区别是isPrototypeOf方法允许您检查对象是否直接从另一个对象继承。请考虑以下事项:
var t = new Object();
var f = new Object();
var c = Object.create(t);
c instanceof f.constructor; // true
c instanceof t.constructor; // true
f.isPrototypeOf(c); // false
t.isPrototypeOf(c); // true
正如您所看到的,构造函数只是实例化对象的函数。不是实现说明符。因此,如果t.y = function(){ return true; }
和f.y = function(){ return false; }
我需要检查c
是否会通过原型链返回相应的实现,那么instanceof
就无济于事。
答案 2 :(得分:1)
instanceOf - >此对象(或从中派生的对象)使用命名对象作为原型
isPrototypeOf - >这个对象被命名的Object(或它派生的对象)用作原型。
即
instanceOf正在查询对象的祖先。
IsPrototypeOf正在查询对象后代。