关于JavaScript中的instanceof运算符

关于JavaScript中的instanceof运算符,javascript,instanceof,Javascript,Instanceof,我对JavaScript非常陌生,无法理解下面的代码(代码源:) 为什么在最后一行中“o instanceof C”返回false?我不明白“C.prototype={}”如何从o的原型链中删除“C.prototype”。 谢谢大家! 创建对象时,会在对象本身上放置指向原型的链接。当构造函数的“prototype”属性更新时,随后构造的对象将引用该新对象,而旧对象仍然引用旧prototype对象。由于该对象不再与构造函数关联,因此instanceof测试失败 构造函数上的原型对象可以根据需要在内

我对JavaScript非常陌生,无法理解下面的代码(代码源:)

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

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

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


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

C.prototype确实会替换整个原型。如果您想扩展原型链,只需在C.prototype上添加一些东西,但不要替换整个东西。
// 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;