JavaScript类:(此类的实例)

JavaScript类:(此类的实例),javascript,class,object,this,instanceof,Javascript,Class,Object,This,Instanceof,我想检查对象是否是当前类的实例 它在类外工作正常,但如果我在类内调用它,则会出现错误 类测试{ 支票(obj){ return(this的obj instanceof)//错误:这不是函数 } } const obj=新测试() console.log(obj instanceof test)//true console.log(new test().check(obj))//错误具体的错误消息是: 未捕获类型错误:“instanceof”的右侧不可调用 在线 return (obj inst

我想检查对象是否是当前类的实例 它在类外工作正常,但如果我在类内调用它,则会出现错误

类测试{
支票(obj){
return(this的obj instanceof)//错误:这不是函数
}
}
const obj=新测试()
console.log(obj instanceof test)//true

console.log(new test().check(obj))//错误
具体的错误消息是:

未捕获类型错误:“instanceof”的右侧不可调用

在线

return (obj instanceof this)
这是有意义的-
instanceof
的右侧应该是一个类(或函数),例如
test
。不能调用非函数(如对象)的东西,因此
instanceof
没有意义

尝试引用对象的构造函数,它将指向类(
test
):

类测试{
支票(obj){
返回this.constructor的obj实例
}
}
obj=新测试()
console.log(obj instanceof test)//true

console.log(new test().check(obj))//错误
具体的错误消息是:

未捕获类型错误:“instanceof”的右侧不可调用

在线

return (obj instanceof this)
这是有意义的-
instanceof
的右侧应该是一个类(或函数),例如
test
。不能调用非函数(如对象)的东西,因此
instanceof
没有意义

尝试引用对象的构造函数,它将指向类(
test
):

类测试{
支票(obj){
返回this.constructor的obj实例
}
}
obj=新测试()
console.log(obj instanceof test)//true

console.log(newtest().check(obj))//ERROR
instanceof
用于测试某个给定原型的给定实例是否给出了构造函数

实际上,您不能检查{}的
{}实例,这才是您真正要做的

这就是第一个检查有效,另一个检查无效的原因

使用
对象#isPrototypeOf
怎么样

A类{
支票(x){
返回A.prototype.isPrototypeOf(x)
}
}
类B扩展了{}
类C{}
常数a=新的a()
常数b=新的b()
常数c=新的c()
console.log(a.check(a))
console.log(a.check(b))

console.log(a.check(c))
instanceof
用于测试某个给定原型的给定实例是否提供了构造函数

实际上,您不能检查{}
{}实例,这才是您真正要做的

这就是第一个检查有效,另一个检查无效的原因

使用
对象#isPrototypeOf
怎么样

A类{
支票(x){
返回A.prototype.isPrototypeOf(x)
}
}
类B扩展了{}
类C{}
常数a=新的a()
常数b=新的b()
常数c=新的c()
console.log(a.check(a))
console.log(a.check(b))

console.log(a.check(c))
imo.
check
不属于它现在所在的位置。将此功能作为实例方法编写是没有意义的;最好是静态方法:

类测试{
//check现在是一种静态方法
静态检查(obj){
//现在'this'指向正确的对象,它被称为的类/对象,
//不是什么例子。
返回此对象的obj实例;
}
}
//扩展类测试
类Test2扩展了测试{}
const obj=new Test(),obj2=new Test2();
//测验
[
()=>测试的obj实例,//真
()=>Test.check(obj),//true
()=>newtest().check(obj),//错误:因为'check'不再是实例方法
//Test2继承了静态检查:
()=>Test2的obj2实例,//true
()=>Test2.check(obj2),//true
()=>Test2.check(obj),//false,obj不是Test2的实例
()=>Test.check(obj2),//true
() => {
var检查=测试检查;
//错误,因为您在这里调用'check',但没有类/对象
退货检查(obj);
}
].forEach(fn=>{
试一试{
日志(“%s:%o”,fn,fn());
}捕捉(错误){
控制台错误(err);
}
});

.as控制台包装{top:0;最大高度:100%!important}
imo.
检查
不属于当前位置。将此功能作为实例方法编写是没有意义的;最好是静态方法:

类测试{
//check现在是一种静态方法
静态检查(obj){
//现在'this'指向正确的对象,它被称为的类/对象,
//不是什么例子。
返回此对象的obj实例;
}
}
//扩展类测试
类Test2扩展了测试{}
const obj=new Test(),obj2=new Test2();
//测验
[
()=>测试的obj实例,//真
()=>Test.check(obj),//true
()=>newtest().check(obj),//错误:因为'check'不再是实例方法
//Test2继承了静态检查:
()=>Test2的obj2实例,//true
()=>Test2.check(obj2),//true
()=>Test2.check(obj),//false,obj不是Test2的实例
()=>Test.check(obj2),//true
() => {
var检查=测试检查;
//错误,因为您在这里调用'check',但没有类/对象
退货检查(obj);
}
].forEach(fn=>{
试一试{
日志(“%s:%o”,fn,fn());
}捕捉(错误){
控制台错误(err);
}
});

.as控制台包装{top:0;max height:100%!important}
谢谢@Matías,但是如何检查对象是否是当前类的实例?还有其他想法吗?@xxyy重新检查我重新更新的答案。查看
Object#isPrototypeOf
如何让您能够测试继承的类是否也是
A
。如果您不想按名称引用当前类(
A.prototype
),您也可以使用
Object.getPrototypeOf(this)
。它起作用了,但当我将“A.prototype”改为“this.prototype”时它给了我一个需要使用的错误this@vlaz你说得对,我可以在回答中说明,