如何获取对象类的名称?我的意思是在这个例子中的“过程”获取对象的构造函数名称
我看到两种方式来获取它。第一个是写一个getter在这个类像
getClassName(){return "Process"}
但我想,如果我尝试调用对象的这个方法不属于这一类,并没有得到类似的方法将是一个错误这个。
而第二个是使用object instanceof Process
。但也许有一些方法可以使它更好,更正确吗?
如何获取对象类的名称?我的意思是在这个例子中的“过程”获取对象的构造函数名称
我看到两种方式来获取它。第一个是写一个getter在这个类像
getClassName(){return "Process"}
但我想,如果我尝试调用对象的这个方法不属于这一类,并没有得到类似的方法将是一个错误这个。
而第二个是使用object instanceof Process
。但也许有一些方法可以使它更好,更正确吗?
您可以从name
上constructor
得到它:
console.log(object.constructor.name);
默认情况下,constructor
是用于创建对象的构造函数;它从对象的原型继承而来。 name
是它的名字。
如果你想成为一个有点偏执有可能是在实例本身constructor
属性,遮蔽在它的原型之一,你可以使用:
console.log(Object.getPrototypeOf(object).constructor.name);
活生生的例子:
class Class1 {
}
const c1 = new Class1();
console.log(c1.constructor.name); // "Class1"
class Class2 {
constructor() {
this.constructor = "I'm special";
}
}
const c2 = new Class2();
console.log(Object.getPrototypeOf(c2).constructor.name); // "Class2"
但要注意的是,TC39委员会指定的JavaScript很高兴è nough建设新的承诺,then
和catch
返回时,使用实例的constructor
财产Promise
秒(见步骤肚里here和从实例中读取constructor
),这样你就不会在你自己,如果你还使用它。他们甚至不去实例的原型。
但是,是的,只是为了完整性,就算你到了原型,它还是有可能,为你引入歧途,因为原型的constructor
属性也与被打乱:
class Example {
}
Example.prototype.constructor = Object; // Why would anyone do this? People are weird.
const e = new Example();
console.log(Object.getPrototypeOf(e).constructor.name); // "Object"
也有可能重新定义name
上的功能:
class Example {
}
// Why would someone do this? People are weird.
Object.defineProperty(Example, "name", {
value: "flibberdeegibbit"
});
const e = new Example();
console.log(Object.getPrototypeOf(e).constructor.name); // "flibberdeegibbit"
因此......警告用户。
注意函数name
财产ES2015的是新的(如class
语法)。如果您通过译员使用class
语法,则可能会正确设置name
。
在对象上使用.constructor.name
。每个对象的构造函数默认引用他的创建函数,该函数具有name属性。它返回函数的名称。
class SomeClass {
}
const obj = new SomeClass();
console.log(obj.constructor.name);
如下使用name
属性:
class Process {}
console.log(Process.name);
const process = new Process;
console.log(process.constructor.name);
这是它工作正常使用原型继承功能相同的方式。
通常object instanceof Process
是可取的,如果它确定知道object
来自此类/函数。有可能会出现这种情况。若干个Process
的外观可能由iframe,多个软件包版本等引起。
存在name
property已存在于常规函数类构造函数中。一个已知的缺陷是它会被缩小为代码,所以它在浏览器JS中通常是无用的,并且它的使用可以被认为是反模式。 name
无法重新分配(在某些浏览器中),因此需要单独的属性来标识该类。
正确的方法是,以避免这个问题
但我想,如果我尝试调用对象的这个方法不属于这一类,并没有得到类似的方法将是一个错误这个。
是使用吸气剂:
class Process {
get className() { return 'Process'; }
...
}
或属性:
class Process {
...
}
Process.prototype.className = 'Process';
其结果是,有可能是几个Process
类具有Process
className
标识符。这可能是合意的或不合适的。而instanceof
将类实例与一个特定的类关联。
你需要做什么?如果它应该在你的应用程序中有一些实际用途,那么显式的'getClassName'方法就是要走的路。 – Bergi
可能重复[在ecmascript-harmony中是否有可能找到对象的类和模块](https://stackoverflow.com/q/19279232/1048572) – Bergi