关于JavaScript中的instanceof运算符

时间:2015-04-13 20:55:28

标签: javascript instanceof

我是JavaScript的新手,无法理解下面的代码(代码来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

// defining constructors
function C(){}
function D(){}

var o = new C();

// true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

// false, because D.prototype is nowhere in o's prototype chain
o instanceof D;

o instanceof Object; // true, because:
C.prototype instanceof Object // true

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

// false, because C.prototype is nowhere in
// o's prototype chain anymore
o instanceof C; 

为什么在最后一行“o instanceof C”返回false?我不明白“C.prototype = {}”如何从o的原型链中删除“C.prototype”。 谢谢!

1 个答案:

答案 0 :(得分:3)

创建对象时,会将原型的链接放在对象本身上。当"原型"更新构造函数的属性,然后构造的对象将引用该新对象,而旧的对象仍引用旧的原型对象。由于该对象不再与构造函数关联,因此instanceof测试失败。

构造函数中的原型对象可以根据需要在内部进行更改,而不会破坏instanceof关系。也就是说,可以添加或删除属性,并且可以更改属性值。

在现代JavaScript环境中,Object.getPrototypeOf()方法可用于检索实例化对象的原型对象。