Как получить класс объекта JavaScript?



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



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

774   14  

14 ответов:

нет точного аналога Java getClass() в JavaScript. В основном это связано с тем, что JavaScript является язык на основе прототипов, в отличие от Java являясь класса один.

в зависимости от того, что вам нужно getClass() для, Есть несколько вариантов в JavaScript:

несколько примеров:

function Foo() {}
var foo = new Foo();

typeof Foo;             // == "function"
typeof foo;             // == "object"

foo instanceof Foo;     // == true
foo.constructor.name;   // == "Foo"
Foo.name                // == "Foo"    

Foo.prototype.isPrototypeOf(foo);   // == true

Foo.prototype.bar = function (x) {return x+x;};
foo.bar(21);            // == 42

Примечание: Если вы компилируете свой код с Uglify, он изменит неглобальные имена классов. Чтобы предотвратить это, Uglify имеет --mangle param, который вы можете установить в false использует залпом или грунт.

obj.constructor.name

работает в большинстве случаев в современных браузерах, несмотря на Function.name официально не добавляется в стандарт до ES6. Если объект создается с помощью var obj = new MyClass(), он вернет "MyClass" в виде строки.

он вернет "число "для чисел," массив "для массивов и" функция " для функций и т. д. Это кажется вполне надежным. Единственные случаи, когда это не удается, если объект создается без прототипа, через Object.create( null ), или объект был создан из анонимно-определенная (безымянная) функция.

возможно, obj.constructor.name гораздо более интуитивно, чем typeof, и может быть инкапсулирован в функцию для обработки нечетного случая, когда constructor не определен (и обрабатывать null ссылки).

Примечание: еще одно преимущество этого метода заключается в том, что он работает интуитивно через границы DOM по сравнению с прямым сравнением объектов конструктора или использованием instanceOf. Причина, которая не работает, как вы могли бы ожидать, есть на самом деле разные экземпляры функции конструктора на каждом DOM, таким образом, сравнение объектов на их конструкторах не будет работать.

примечание 2: как ни странно, этот метод, по-видимому, возвращает имя самой базовой функции, используемой в цепочке прототипов, что, к сожалению, не интуитивно понятно. Например, если B прототипически происходит от A и вы создаете новый экземпляр B,b,b.constructor.name возвращает "A"! Так что это кажется совершенно обратным. Оно однако отлично работает для одноуровневых прототипов и всех примитивов.

эта функция возвращает либо "undefined","null" или "class" на [object class] С Object.prototype.toString.call(someObject).

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}

getClass("")   === "String";
getClass(true) === "Boolean";
getClass(0)    === "Number";
getClass([])   === "Array";
getClass({})   === "Object";
getClass(null) === "null";
// etc...

чтобы получить "псевдо класс", вы можете получить функцию конструктора, по

obj.constructor

предполагая, что constructor устанавливается правильно, когда вы делаете наследование - что - то вроде:

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

и эти две строки вместе с:

var woofie = new Dog()

сделает woofie.constructor выберите пункт Dog. Обратите внимание, что Dog является функцией конструктора, и является

Вы можете получить ссылку на функцию-конструктор, который создал объект с помощью конструктор собственность:

function MyObject(){
}

var obj = new MyObject();
obj.constructor; // MyObject

Если вам нужно подтвердить тип объекта во время выполнения, вы можете использовать instanceof оператор:

obj instanceof MyObject // true

у меня была ситуация, чтобы работать общий сейчас и использовал это:

class Test {
  // your class definition
}

nameByType = function(type){
  return type.prototype["constructor"]["name"];
};

console.log(nameByType(Test));

это единственный способ я нашел, чтобы получить имя класса на ввод типа, если у вас нет экземпляра объекта.

(написано в ES2017)

точечная нотация также отлично работает

console.log(Test.prototype.constructor.name); // returns "Test" 

найти object.constructor.toString() return [object objectClass] в IE ,а не function objectClass () {} вернулся в Хоме. Итак, я думаю, что код вhttp://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects может не работать хорошо в IE.И я исправил код следующим образом:

код:

var getObjectClass = function (obj) {
        if (obj && obj.constructor && obj.constructor.toString()) {

                /*
                 *  for browsers which have name property in the constructor
                 *  of the object,such as chrome 
                 */
                if(obj.constructor.name) {
                    return obj.constructor.name;
                }
                var str = obj.constructor.toString();
                /*
                 * executed if the return of object.constructor.toString() is 
                 * "[object objectClass]"
                 */

                if(str.charAt(0) == '[')
                {
                        var arr = str.match(/\[\w+\s*(\w+)\]/);
                } else {
                        /*
                         * executed if the return of object.constructor.toString() is 
                         * "function objectClass () {}"
                         * for IE Firefox
                         */
                        var arr = str.match(/function\s*(\w+)/);
                }
                if (arr && arr.length == 2) {
                            return arr[1];
                        }
          }
          return undefined; 
    };

для классов Javascript в ES6 вы можете использовать object.constructor. В примере класса ниже getClass() метод возвращает класс ES6, как и следовало ожидать:

var Cat = class {

    meow() {

        console.log("meow!");

    }

    getClass() {

        return this.constructor;

    }

}

var fluffy = new Cat();

...

var AlsoCat = fluffy.getClass();
var ruffles = new AlsoCat();

ruffles.meow();    // "meow!"

если вы создаете экземпляр класса из getClass метод убедитесь, что вы обернуть его в скобках, например ruffles = new ( fluffy.getClass() )( args... );

в javascript нет классов, но я думаю, что вы хотите имя конструктора и obj.constructor.toString() скажу вам, что вам нужно.

в соответствии с его непрерывной записью обратной совместимости, ECMAScript 6, JavaScript все еще не имеет class тип (хотя не все это понимают). Это тут есть class ключевое слово как часть его class синтаксис для создания прототипов, но по-прежнему нет вещи, называемой классом. JavaScript сейчас нет и есть никогда не был классическим языком ООП. Говоря о JS с точки зрения класса, это только вводит в заблуждение или признак еще нет нашарили прототипное наследование (просто держать его реальной).

что означает this.constructor по-прежнему отличный способ получить ссылку на

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

вот обновленная функция того, который опубликовал Эли Грей, чтобы соответствовать моему образу мышления

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;
}

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

вот реализация 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];
}

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

С помощью следующего объяснения мы можем получить класс объекта (на самом деле он называется prototype в 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' объект, который создается из прототипа массива. Итак, для того, чтобы иметь .last свойство, чтобы быть доступным для всех объектов, созданных из прототипа массива, мы должны определить .last свойство для прототипа массива:

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

проблема здесь в том, что вы должны знать, какой тип объекта (прототип)'arr' и ' принадлежит! Другими словами, если вы не знаете тип класса (прототипа)'', то вы не сможете определить свойство для них. В приведенном выше примере, мы знаем, что arr-это экземпляр объекта 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 ' является массивом, мы можем добавить новое свойство просто bu ссылаясь на класс 'arr' С помощью 'arr.__proto__'.

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

Comments

    Ничего не найдено.