我是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”。 谢谢!
答案 0 :(得分:3)
创建对象时,会将原型的链接放在对象本身上。当"原型"更新构造函数的属性,然后构造的对象将引用该新对象,而旧的对象仍引用旧的原型对象。由于该对象不再与构造函数关联,因此instanceof
测试失败。
构造函数中的原型对象可以根据需要在内部进行更改,而不会破坏instanceof
关系。也就是说,可以添加或删除属性,并且可以更改属性值。
在现代JavaScript环境中,Object.getPrototypeOf()
方法可用于检索实例化对象的原型对象。