为什么我们需要isPrototypeOf?

时间:2011-05-12 03:26:10

标签: javascript ecmascript-5

this page州:

  

注意: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)

3 个答案:

答案 0 :(得分:15)

对象构造函数是时髦的东西。来自this answer

  

Pointy指出,in his answer

     
    

“构造函数”属性是一个     引用创建的函数     对象的原型,而不是对象     本身。

  
     

解决这个问题的通常方法是   增加对象的原型   分配后的constructor属性   到prototype

对象的构造函数不是只读的,这就是为什么可以这样做的原因。在p.constructor创建后,我可以为p分配任何值,这将完全打破使用

o instanceof p.constructor

而不是

p.isPrototypeOf(o)

进一步阅读


编辑 re:OP编辑

  

另外,p.isPrototypeOf(o)在功能上等同于p===Object.getPrototypeOf(o)

除了在JavaScript 1.8.1之前没有引入Object.getPrototypeOf的事实之外,这些问题比原始问题更相似吗?见John Resig - Object.getPrototypeOf。也许更相关,这两个函数在the spec中是不同的! (警告,PDF链接)

15.2.3.2 Object.getPrototypeOf

15.2.4.6 Object.prototype.isPrototypeOf

答案 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正在查询对象后代。