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中没有Java
getClass()
等价物,因此应该使用如下内容:

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: (...)";