Javascript 检查对象是否为';直接实例&x27;一流的
我有两门课:Javascript 检查对象是否为';直接实例&x27;一流的,javascript,class,object,instance,subclass,Javascript,Class,Object,Instance,Subclass,我有两门课: class Bar extends Foo { // Foo isn't relevant constructor(value) { if (!(value instanceof Foo)) throw "InvalidArgumentException: (...)"; super(); this.value = value; } } class Baz extends Bar { constructor(value) { super
class Bar extends Foo { // Foo isn't relevant
constructor(value) {
if (!(value instanceof Foo)) throw "InvalidArgumentException: (...)";
super();
this.value = value;
}
}
class Baz extends Bar {
constructor(value) {
super(value);
}
}
条
构造函数
检查值
是否是Foo的实例,如果不是,则抛出错误。至少,这是我想要它做的。如果将条
或Baz
作为值传递,If语句也会返回true
。目标是只让Foo
s通过。我已经找到了,但这并没有真正回答我的问题。如果你知道所有你可以使用的类
if(!(value instanceof Foo && !(value instanceof Bar) && !(value instanceof Baz)))
检查构造函数:
if (!value || value.constructor !== Foo)
throw 'InvalidArgumentException: (...)';
或者对象的原型(这更类似于instanceof
的功能):
问题是您引用的所有类都是
Foo
的后代。这样new Baz()instanceOf Bar&&new Bar()instanceOf Foo===true
。
因此,当您询问是否为Foo的Bar instanceOf时,通过继承将是正确的
由于JS中没有JavagetClass()
等价物,因此应该使用如下内容:
if (value.constructor.name !== Foo.name)
您可以使用
Object.getPrototypeOf(yourObj)
和Foo.prototype
之间的比较来查看yourObj
是否正是Foo
的实例。您只需继续为每个级别调用Object.getPrototypeOf
,就可以沿着链向上移动
例如:
class Foo{}
类栏扩展了Foo{}
类Baz扩展了Bar{}
const foo=新foo();
常量条=新条();
const baz=新的baz();
//对于此功能:
//-级别0为自我
//-级别1是父级
//-第二级是祖父母
//等等。
函数getPrototypeAt(级别,obj){
设proto=Object.getPrototypeOf(obj);
while(level--)proto=Object.getPrototypeOf(proto);
返回原型;
}
log(“bar是一个foo:”,bar instanceof foo);
log(“baz是一个foo:”,baz instanceof foo);
log(“foo完全是一个foo:”,getPrototypeAt(0,foo)==foo.prototype);
log(“bar完全是一个foo:”,getPrototypeAt(0,bar)==foo.prototype);
log(“bar是foo:,getPrototypeAt(1,bar)==foo.prototype的直接子对象”);
log(“baz是foo:,getPrototypeAt(1,baz)==foo.prototype的直接子对象”);
log(“baz是bar:,getPrototypeAt(1,baz)==bar.prototype的直接子对象”);
log(“baz是foo的孙子:”,getPrototypeAt(2,baz)==foo.prototype)
您应该测试值
的内部[[Prototype]]
是否正是Foo.Prototype
。您可以通过以下方式获得内部[[Prototype]]
:
我创造了这个函数来检查DOM类和元素之间的关系
const getCreator=instance=>Object.getPrototypeOf(instance.constructor.name;
//用法
getCreator(document.documentElement)==“HTMLHtmlElement;
您链接的另一个问题似乎有效。只有使用new Foo()创建的Foo对象才会返回“Foo“调用foo.constructor.name
时,您认为您需要它做什么?你似乎在滥用继承权,因为你的目标是打破传统。不要那样做。每个Bar
和Baz
实例都应该在希望有Foo
实例的地方有效。这并不能回答核心问题。它不能解决继承问题。@Sacha请查看我对其他类的泛型检查的答案Java中的getClass()
做了什么value.constructor
在JS中没有做什么?你永远不应该比较类的名称。它们可能被迷你们破坏,可能被优化掉,可能被覆盖或伪造。永远不要依赖名字。
if (value.constructor.name !== Foo.name)
if ( Object.getPrototypeOf( value ) !== Foo.prototype )
throw "InvalidArgumentException: (...)";