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你说得对,我可以在回答中说明,