Как получить класс объекта JavaScript? - PullRequest
606 голосов
/ 08 августа 2009

Я создал объект JavaScript, но как я могу определить класс этого объекта?

Я хочу что-то похожее на метод Java .getClass().

Ответы [ 15 ]

1 голос
/ 17 октября 2014

Согласитесь с dfa, поэтому я рассматриваю прототип как класс, когда не найдено ни одного именованного класса

Вот обновленная функция, опубликованная Эли Греем, в соответствии с моим разумом

function what(obj){
    if(typeof(obj)==="undefined")return "undefined";
    if(obj===null)return "Null";
    var res = Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];
    if(res==="Object"){
        res = obj.constructor.name;
        if(typeof(res)!='string' || res.length==0){
            if(obj instanceof jQuery)return "jQuery";// jQuery build stranges Objects
            if(obj instanceof Array)return "Array";// Array prototype is very sneaky
            return "Object";
        }
    }
    return res;
}
0 голосов
/ 31 марта 2019

Попробуй мою библиотеку typcript-class-helpers :

import { CLASS } from 'typescript-class-helpers'

@CLASS.NAME('Example')
class Example {

}

console.log(CLASS.getName(Example) === 'Example') // true
console.log(CLASS.getNameFromObject(new Example()) === 'Example') // true
console.log(CLASS.getBy('Example') === Example) // true

Таким образом, вы можете использовать свои имена классов даже после процесса uglify.

Установка:

npm i typescript-class-helpers
0 голосов
/ 12 ноября 2016

Вопрос, кажется, уже получен, но ОП хочет получить доступ к классу и объекту, так же, как мы делаем в Java, и выбранного ответа недостаточно (imho).

С помощью следующего объяснения мы можем получить класс объекта (на самом деле он называется прототипом в javascript).

var arr = new Array('red', 'green', 'blue');
var arr2 = new Array('white', 'black', 'orange');

Вы можете добавить свойство как это:

Object.defineProperty(arr,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue

Но свойство .last будет доступно только для объекта arr, который создается из прототипа Array. Итак, чтобы свойство .last было доступно для всех объектов, созданных из прототипа Array, мы должны определить свойство .last для прототипа Array:

Object.defineProperty(Array.prototype,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

Проблема здесь в том, что вы должны знать, к какому типу объекта (прототипу) относятся переменные 'arr' и 'arr2'! Другими словами, если вы не знаете тип класса (прототип) объекта 'arr', вы не сможете определить свойство для них. В приведенном выше примере мы знаем, что arr является экземпляром объекта Array, поэтому мы использовали Array.prototype, чтобы определить свойство для Array. Но что, если мы не знали класс (прототип) 'arr'?

Object.defineProperty(arr.__proto__,'last2', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

Как видите, не зная, что 'arr' является массивом, мы можем добавить новое свойство, просто ссылаясь на класс arr, используя arr.__proto__.

Мы получили доступ к прототипу arr, не зная, что это экземпляр массива, и я думаю, что об этом спросил OP.

0 голосов
/ 23 декабря 2015

Вот реализация getClass() и getInstance()

Вы можете получить ссылку на класс объекта, используя window.

Из контекста экземпляра:

function A() {
    this.getClass = function() {
        return window[this.constructor.name];
    }

    this.getNewInstance = function() {
        return new window[this.constructor.name];
    }
}

var a = new A();
console.log(a.getClass());  //  function A { // etc... }

// you can even:
var b = new a.getClass();
b instanceof A; // true

Из статического контекста:

function B() {};

B.getClass = function() {
    return window[this.name];
}

B.getInstance() {
    return new window[this.name];
}
0 голосов
/ 08 августа 2009

Javascript - это языки без классов: нет классов, которые бы определяли поведение класса статически, как в Java. JavaScript использует прототипы вместо классов для определения свойств объекта, включая методы и наследование. Можно моделировать многие функции классов на основе прототипов в JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...