2017-09-14 62 views
1

如何获取对象类的名称?我的意思是在这个例子中的“过程”enter image description here获取对象的构造函数名称

我看到两种方式来获取它。第一个是写一个getter在这个类像

getClassName(){return "Process"} 

但我想,如果我尝试调用对象的这个方法不属于这一类,并没有得到类似的方法将是一个错误这个。

而第二个是使用object instanceof Process。但也许有一些方法可以使它更好,更正确吗?

+1

你需要做什么?如果它应该在你的应用程序中有一些实际用途,那么显式的'getClassName'方法就是要走的路。 – Bergi

+0

可能重复[在ecmascript-harmony中是否有可能找到对象的类和模块](https://stackoverflow.com/q/19279232/1048572) – Bergi

回答

3

您可以从nameconstructor得到它:

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建设新的承诺,thencatch返回时,使用实例的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

+1

“*如果你想变得有点偏执*” ...你不会使用任何'.constructor'或'.name'属性:-) – Bergi

+0

@Bergi:呃,有些偏执狂。 :-) –

+0

@ T.J.Crowder非常感谢! – RoGGeR

2

在对象上使用.constructor.name。每个对象的构造函数默认引用他的创建函数,该函数具有name属性。它返回函数的名称。

class SomeClass { 
 

 
} 
 

 
const obj = new SomeClass(); 
 

 
console.log(obj.constructor.name);

0

如下使用name属性:

class Process {} 
 

 
console.log(Process.name); 
 

 
const process = new Process; 
 

 
console.log(process.constructor.name);

这是它工作正常使用原型继承功能相同的方式。

1

通常object instanceof Process是可取的,如果它确定知道object来自此类/函数。有可能会出现这种情况。若干个Process的外观可能由iframe,多个软件包版本等引起。

存在name property已存在于常规函数类构造函数中。一个已知的缺陷是它会被缩小为代码,所以它在浏览器JS中通常是无用的,并且它的使用可以被认为是反模式。 name无法重新分配(在某些浏览器中),因此需要单独的属性来标识该类。

正确的方法是,以避免这个问题

但我想,如果我尝试调用对象的这个方法不属于这一类,并没有得到类似的方法将是一个错误这个。

是使用吸气剂:

class Process { 
    get className() { return 'Process'; } 
    ... 
} 

或属性:

class Process { 
    ... 
} 
Process.prototype.className = 'Process'; 

其结果是,有可能是几个Process类具有ProcessclassName标识符。这可能是合意的或不合适的。而instanceof将类实例与一个特定的类关联。