为什么我们需要isPrototypeOf?

Pac*_*ier 15 javascript ecmascript-5

此页面说明:

注意:isPrototypeOf与instanceof运算符不同.在表达式对象instanceof AFunction中,对象原型链将针对AFunction.prototype进行检查,而不是针对AFunction本身

好吧,我真的没有得到他们想要告诉我们的东西.object instanceof AFunction与`AFunction.prototype.isPrototypeOf(object)不完全相同?或者我错了?

为什么我们需要它isPrototypeOf呢?

如果我需要做的话p.isPrototypeOf(o),我不能这样做o instanceof p.constructor吗?

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

Mat*_*all 15

对象构造函数是时髦的东西.从这个答案:

正如Pointy 在他的回答中指出的那样

"constructor"属性是对创建对象原型的函数的引用,而不是对象本身.

解决这个问题的常用方法是constructor在分配对象之后扩充对象的prototype 属性prototype.

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

o instanceof p.constructor
Run Code Online (Sandbox Code Playgroud)

代替

p.isPrototypeOf(o)
Run Code Online (Sandbox Code Playgroud)

进一步阅读


编辑重新:OP编辑

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

那些比你原来的问题更相似,除了Object.getPrototypeOf直到JavaScript 1.8.1才引入的事实?见John Resig -Object.getPrototypeOf.也许更相关,这两个功能在规格上有所不同!(警告,PDF链接)

15.2.3.2 Object.getPrototypeOf

15.2.4.6 Object.prototype.isPrototypeOf


Gab*_*iel 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
Run Code Online (Sandbox Code Playgroud)

如您所见,构造函数只是实例化对象的函数.不是实现说明符.因此,如果t.y = function(){ return true; }f.y = function(){ return false; }我需要检查c它将通过它的原型链返回适当的实现,那instanceof将无济于事.