15

该页面指出:

注意: isPrototypeOf 与 instanceof 运算符不同。在表达式 object 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)?

4

3 回答 3

15

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

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

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

处理这个问题的常用方法是 constructor在分配给prototype.

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

o instanceof p.constructor

代替

p.isPrototypeOf(o)

进一步阅读


重新编辑:OP 编辑

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

Object.getPrototypeOf除了直到 JavaScript 1.8.1 才引入的事实之外,这些都比您原来的问题更相似?见约翰·雷西格 -Object.getPrototypeOf。也许更相关的是,这两个功能在规范中是不同的!(警告,PDF链接)

15.2.3.2 Object.getPrototypeOf

15.2.4.6 Object.prototype.isPrototypeOf

于 2011-05-12T03:44:16.873 回答
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将无济于事。

于 2011-05-12T03:40:23.803 回答
1

instanceOf --> 这个对象(或它派生的对象)使用命名对象作为原型

isPrototypeOf --> 这个对象被命名对象(或它派生的对象)用作原型。

IE。

instanceOf 正在查询对象的祖先。

IsPrototypeOf 正在查询对象的后代。

于 2011-05-12T03:33:29.567 回答