Javascript Object.prototype.isPrototypeOf与obj.prototype.isPrototypeOf
我并不期待两者之间的差异。Airbnb已经很好地解释了这一点 考虑一个普通类及其实现,如下所示:Javascript Object.prototype.isPrototypeOf与obj.prototype.isPrototypeOf,javascript,prototype,Javascript,Prototype,我并不期待两者之间的差异。Airbnb已经很好地解释了这一点 考虑一个普通类及其实现,如下所示: class C1 {} const c1Imp = new C1(); 其中.prototype应继承自 为什么以下不等同 console.info(Object.prototype.isPrototypeOf.call(C1, c1Imp)); // false console.info(C1.prototype.isPrototypeOf(c1Imp)); // true (()=>{ 类
class C1 {}
const c1Imp = new C1();
其中.prototype
应继承自
为什么以下不等同
console.info(Object.prototype.isPrototypeOf.call(C1, c1Imp)); // false
console.info(C1.prototype.isPrototypeOf(c1Imp)); // true
(()=>{
类别C1{}
常数c1Imp=新的C1();
console.info(c1Imp.constructor.name);
info(`${Object.prototype.isPrototypeOf.call(C1,c1Imp)}(应该是true)`);
console.info(`${C1.prototype.isPrototypeOf(c1Imp)}(应该是true)`);
类C2{}
常数c2Imp=新的C2();
console.info(c2Imp.constructor.name);
console.info(`${Object.prototype.isPrototypeOf.call(C1,c2Imp)}(应该是false)`);
console.info(`${C1.prototype.isPrototypeOf(c2Imp)}(应该是false)`);
})();代码>您应该这样做:
Object.prototype.isPrototypeOf.call(C1.prototype, c1Imp) // true
在第一个示例中,您在C1
本身上调用Object.prototype.isPrototypeOf
方法,而在第二个示例中,您在C1.prototype
上调用isPrototypeOf
这只是一些棘手的语义问题。
如上所述,修复方法是在C1.prototype
本身上调用Object.prototype.isPrototypeOf
查看更新的代码段:
(()=>{
类别C1{}
常数c1Imp=新的C1();
console.info(c1Imp.constructor.name);
console.info(`${Object.prototype.isPrototypeOf.call(C1.prototype,c1Imp)}(应该是true)`);
console.info(`${C1.prototype.isPrototypeOf(c1Imp)}(应该是true)`);
类C2{}
常数c2Imp=新的C2();
console.info(c2Imp.constructor.name);
console.info(`${Object.prototype.isPrototypeOf.call(C1,c2Imp)}(应该是false)`);
console.info(`${C1.prototype.isPrototypeOf(c2Imp)}(应该是false)`);
})();代码>对象。原型
指的是对象
的一个非常具体的实例<代码>C1。原型
也指对象
,但与对象的实际实例不同。原型
。将类型与实例分开。两个实例可以是相同的类型,但可以是不同的对象。您实际上调用了C1.isPrototypeOf(c1Imp))
,这是false,因为C1.prototype.isPrototypeOf(c1Imp)
是true。