Eu criei um objeto JavaScript, mas como posso determinar a classe desse objeto?
Eu quero algo semelhante ao .getClass()
método Java .
javascript
oop
DNB5brims
fonte
fonte
class
tipo. Ele faz ter umaclass
palavra-chave eclass
sintaxe para a criação de protótipos em que os métodos podem mais facilmente acessosuper
.Respostas:
Não há contrapartida exata do Java
getClass()
em JavaScript. Principalmente porque o JavaScript é uma linguagem baseada em protótipo , em vez de Java ser uma linguagem baseada em classe .Dependendo do que você precisa
getClass()
, existem várias opções em JavaScript:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Alguns exemplos:
Nota: se você estiver compilando seu código com o Uglify, ele mudará os nomes de classes não globais. Para evitar isso, o Uglify tem um
--mangle
parâmetro que você pode definir como false usando gulp ou grunt .fonte
func.prototype
(sim, funções são objetos, mas aprototype
propriedade é relevante apenas em objetos de função).instanceof
/isPrototypeOf()
ea não-padrão__proto__
Object.getPrototypeOf()
constructor.name
se seu código estiver sendo minificado. O nome da função mudará arbitrariamente.construction.name
como um token a ser ignorado / não minimizado. Além da maioria dos softwares minificadores (se não todos), eles fornecem regras de exceção.é um método confiável em navegadores modernos.
Function.name
foi oficialmente adicionado ao padrão no ES6, tornando-o um meio compatível com os padrões de obter a "classe" de um objeto JavaScript como uma string. Se o objeto for instanciadovar obj = new MyClass()
, ele retornará "MyClass".Ele retornará "Número" para números, "Matriz" para matrizes e "Função" para funções, etc. Geralmente se comporta conforme o esperado. Os únicos casos em que falha é se um objeto é criado sem um protótipo, via
Object.create( null )
ou se o objeto foi instanciado a partir de uma função definida anonimamente (sem nome).Observe também que, se você estiver minificando seu código, não é seguro comparar com cadeias de caracteres codificadas. Por exemplo, em vez de verificar se
obj.constructor.name == "MyType"
, verifiqueobj.constructor.name == MyType.name
. Ou apenas compare os próprios construtores, no entanto, isso não funcionará através dos limites do DOM, pois existem instâncias diferentes da função do construtor em cada DOM, portanto, fazer uma comparação de objetos nos construtores não funcionará.fonte
Function.name
ainda não faz parte do padrão JavaScript. Atualmente, ele é suportado no Chrome e Firefox, mas não no IE (10).obj.constructor.name
funciona apenas para funções nomeadas . Ou seja, se eu definirvar Foo = function() {}
, então forvar foo = new Foo()
,foo.constructor.name
fornecerá uma string vazia.constructor.name
se seu código estiver sendo minificado. O nome da função mudará arbitrariamente.constructor.name
se comportar conforme o esperado com o novo suporte de classe no ES6.Esta função retorna
"Undefined"
para valores indefinidos e"Null"
para nulos.Para todos os outros valores, a
CLASSNAME
parte-é extraída[object CLASSNAME]
, que é o resultado do usoObject.prototype.toString.call(value)
.fonte
"Object"
.return obj.constructor.name
. Isso fornece os mesmos resultados e também lida com objetos não nativos.Para obter a "pseudo classe", você pode obter a função construtora,
assumindo que o
constructor
está definido corretamente quando você faz a herança - que é algo como:e essas duas linhas, juntamente com:
fará
woofie.constructor
questão deDog
. Observe queDog
é uma função construtora e é umFunction
objeto. Mas você pode fazerif (woofie.constructor === Dog) { ... }
.Se você deseja obter o nome da classe como uma string, achei o seguinte funcionando bem:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Ele chega à função construtora, converte-a em string e extrai o nome da função construtora.
Observe que
obj.constructor.name
poderia ter funcionado bem, mas não é padrão. Está no Chrome e Firefox, mas não no IE, incluindo o IE 9 ou IE 10 RTM.fonte
Você pode obter uma referência à função construtora que criou o objeto usando a propriedade construtor :
Se você precisar confirmar o tipo de um objeto em tempo de execução, poderá usar a instância do operador:
fonte
De acordo com seu registro ininterrupto de compatibilidade com versões anteriores, o ECMAScript 6, o JavaScript ainda não possui um
class
tipo (embora nem todos entendam isso). Ele faz ter umaclass
palavra-chave como parte de suaclass
sintaxe para a criação de protótipos, mas ainda não há coisa chamada classe . O JavaScript não é agora e nunca foi uma linguagem clássica de POO . Falar de JS em termos de classe é apenas enganoso ou um sinal de herança prototípica ainda não gritante (apenas mantendo-a real).Isso significa que
this.constructor
ainda é uma ótima maneira de obter uma referência para aconstructor
função. Ethis.constructor.prototype
é o caminho para acessar o próprio protótipo. Como este não é Java, não é uma classe. É o objeto de protótipo do qual sua instância foi instanciada. Aqui está um exemplo usando o açúcar sintático ES6 para criar uma cadeia de protótipos:Isto é o que isso gera usando
babel-node
:Aí está! Em 2016, há uma
class
palavra - chave em JavaScript, mas ainda não existe um tipo de classe.this.constructor
é a melhor maneira de obter a função construtora,this.constructor.prototype
a melhor maneira de obter acesso ao próprio protótipo.fonte
Eu tive uma situação para trabalhar genérico agora e usei isso:
essa é a única maneira que encontrei para obter o nome da classe por tipo input, se você não tiver uma instância de um objeto.
(escrito em ES2017)
notação de ponto também funciona bem
fonte
Para Classes Javascript no ES6, você pode usar
object.constructor
. Na classe de exemplo abaixo, ogetClass()
método retorna a classe ES6 conforme o esperado:Se você instanciar a classe a partir do
getClass
método, envolva-a entre colchetes, por exemploruffles = new ( fluffy.getClass() )( args... );
fonte
Encontro
object.constructor.toString()
retorno[object objectClass]
no IE, em vez defunction objectClass () {}
retornar no chome. Portanto, acho que o código em http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects pode não funcionar bem no IE.E eu corrigi o código da seguinte maneira:código:
fonte
Em javascript, não há classes, mas acho que você deseja o nome do construtor e
obj.constructor.toString()
dirá o que você precisa.fonte
.name
..name
não está definido ainda no IE 9Concordo com o dfa, é por isso que considero o protótipo como a classe quando nenhuma classe nomeada foi encontrada
Aqui está uma função atualizada da postada por Eli Gray, para combinar com meu modo de pensar
fonte
Se você precisar não apenas da classe GET, mas também EXTENDER que ela tenha apenas uma instância, escreva:
vamos ter
para estender A tendo a instância apenas use:
fonte
Sugiro usar
Object.prototype.constructor.name
:fonte
Aqui está uma implementação
getClass()
egetInstance()
Você pode obter uma referência para a classe de um objeto usando
this.constructor
.Em um contexto de instância:
Do contexto estático:
fonte
this.constructor
?Você também pode fazer algo assim
Isso informará se a entrada é classe ou não
fonte
Javascript é uma linguagem sem classe: não há classes que definam o comportamento de uma classe estaticamente como em Java. O JavaScript usa protótipos em vez de classes para definir propriedades do objeto, incluindo métodos e herança. É possível simular muitos recursos baseados em classe com protótipos em JavaScript.
fonte
class
tipo. Ele faz ter umaclass
palavra-chave eclass
sintaxe para a criação de protótipos em que os métodos podem mais facilmente acessosuper
.A pergunta parece já respondida, mas o OP deseja acessar a classe e o objeto, assim como fazemos em Java e a resposta selecionada não é suficiente (imho).
Com a seguinte explicação, podemos obter uma classe de um objeto (na verdade, é chamado de protótipo em javascript).
Você pode adicionar uma propriedade como esta:
Mas a
.last
propriedade estará disponível apenas paraarr
o objeto que é instanciado a partir do protótipo Array. Portanto, para que a.last
propriedade esteja disponível para todos os objetos instanciados no protótipo Array, precisamos definir a.last
propriedade para o protótipo Array:O problema aqui é que você precisa saber a que tipo de objeto (protótipo) as variáveis '
arr
' e 'arr2
' pertencem! Em outras palavras, se você não souber o tipo de classe (protótipo) doarr
objeto ' ', não poderá definir uma propriedade para eles. No exemplo acima, sabemos que arr é uma instância do objeto Array, por isso usamos Array.prototype para definir uma propriedade para Array. Mas e se não conhecêssemos a classe (protótipo) do 'arr
'?Como você pode ver, sem saber que '
arr
' é uma matriz, podemos adicionar uma nova propriedade apenas referindo a classe de 'arr
' usando 'arr.__proto__
'.Acessamos o protótipo do '
arr
' sem saber que é uma instância do Array e acho que foi o que o OP pediu.fonte
__proto__
propriedade está obsoleta e quase não tem vantagem sobre aprototype
propriedade.