[javascript] 객체 또는 클래스 이름 가져 오기

객체의 함수 이름을 얻는 솔루션이 있습니까?

function alertClassOrObject (o) {
   window.alert(o.objectName); //"myObj" OR "myClass" as a String
}

function myClass () {
   this.foo = function () {
       alertClassOrObject(this);
   }
}

var myObj = new myClass();
myObj.foo();

for (var k in this) {...}-에 대한 정보가 없다 className거나 ObjectName. 그들 중 하나를 얻을 수 있습니까?



답변

객체의 생성자 함수를 가져온 다음 이름 속성 을 검사하십시오 .

myObj.constructor.name

“myClass”를 반환합니다.


답변

예:

function Foo () { console.log('Foo function'); }
var Bar = function () { console.log('Bar function'); };
var Abc = function Xyz() { console.log('Abc function'); };

var f = new Foo();
var b = new Bar();
var a = new Abc();

console.log('f', f.constructor.name); // -> "Foo"
console.log('b', b.constructor.name); // -> "Function"
console.log('a', a.constructor.name); // -> "Xyz"


답변

표준 IIFE를 사용하는 경우 (예 : TypeScript)

var Zamboch;
(function (_Zamboch) {
    (function (Web) {
        (function (Common) {
            var App = (function () {
                function App() {
                }
                App.prototype.hello = function () {
                    console.log('Hello App');
                };
                return App;
            })();
            Common.App = App;
        })(Web.Common || (Web.Common = {}));
        var Common = Web.Common;
    })(_Zamboch.Web || (_Zamboch.Web = {}));
    var Web = _Zamboch.Web;
})(Zamboch || (Zamboch = {}));

프로토 타입에 미리 주석을 달 수 있습니다.

setupReflection(Zamboch, 'Zamboch', 'Zamboch');

_fullname 및 _classname 필드를 사용하십시오.

var app=new Zamboch.Web.Common.App();
console.log(app._fullname);

여기에 주석 기능 :

function setupReflection(ns, fullname, name) {
    // I have only classes and namespaces starting with capital letter
    if (name[0] >= 'A' && name[0] <= 'Z') {
        var type = typeof ns;
        if (type == 'object') {
            ns._refmark = ns._refmark || 0;
            ns._fullname = fullname;
            var keys = Object.keys(ns);
            if (keys.length != ns._refmark) {
                // set marker to avoid recusion, just in case 
                ns._refmark = keys.length;
                for (var nested in ns) {
                    var nestedvalue = ns[nested];
                    setupReflection(nestedvalue, fullname + '.' + nested, nested);
                }
            }
        } else if (type == 'function' && ns.prototype) {
            ns._fullname = fullname;
            ns._classname = name;
            ns.prototype._fullname = fullname;
            ns.prototype._classname = name;
        }
    }
}

JS 피들


답변

이것이 이미 답변되었으므로 JavaScript로 객체 생성자를 얻는 방법의 차이점을 지적하고 싶었습니다. 생성자와 실제 객체 / 클래스 이름에는 차이가 있습니다. 다음 사항이 결정의 복잡성을 더한다면 다음을 찾고있을 것입니다 instanceof. 아니면 당신은 스스로에게 “왜 내가 이것을하고 있는가? 이것이 정말로 내가 해결하려고하는 것입니까?”

노트:

obj.constructor.name이전 버전의 브라우저에서 사용할 수 없습니다. 어울리는(\w+) 는 ES6 스타일 클래스를 충족해야합니다.

암호:

var what = function(obj) {
  return obj.toString().match(/ (\w+)/)[1];
};

var p;

// Normal obj with constructor.
function Entity() {}
p = new Entity();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

// Obj with prototype overriden.
function Player() { console.warn('Player constructor called.'); }
Player.prototype = new Entity();
p = new Player();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// Obj with constructor property overriden.
function OtherPlayer() { console.warn('OtherPlayer constructor called.'); }
OtherPlayer.constructor = new Player();
p = new OtherPlayer();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// Anonymous function obj.
p = new Function("");
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// No constructor here.
p = {};
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// ES6 class.
class NPC {
  constructor() {
  }
}
p = new NPC();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

// ES6 class extended
class Boss extends NPC {
  constructor() {
    super();
  }
}
p = new Boss();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

결과:

여기에 이미지 설명을 입력하십시오

코드 : https://jsbin.com/wikiji/edit?js,console


답변

나는 비슷한 어려움에 직면하고 있었고 여기에 제시된 솔루션 중 어느 것도 내가 작업중 인 것에 최적이 아닙니다. 내가 가진 것은 콘텐츠를 모달로 표시하는 일련의 함수 였고 클래스의 함수, 메소드를 만드는 단일 객체 정의에서 리팩토링하려고했습니다. 문제 중 하나가 메소드 중 하나에 onClick을 사용하는 모달 자체 내에 일부 탐색 버튼을 만들었을 때 발생했습니다. 이제 클래스의 객체입니다. 이러한 탐색 버튼을 처리하는 다른 방법을 고려했지만 여전히 부모 창에 정의 된 변수를 스윕하여 클래스 자체의 변수 이름을 찾을 수있었습니다. 내가 한 것은 내 수업의 ‘인스턴스’와 일치하는 것을 검색하는 것이 었으며, 둘 이상의 경우가 있습니다.

var myClass = function(varName)
{
    this.instanceName = ((varName != null) && (typeof(varName) == 'string') && (varName != '')) ? varName : null;

    /**
     * caching autosweep of window to try to find this instance's variable name
     **/
    this.getInstanceName = function() {
        if(this.instanceName == null)
        {
            for(z in window) {
                if((window[z] instanceof myClass) && (window[z].uniqueProperty === this.uniqueProperty)) {
                    this.instanceName = z;
                    break;
                }
            }
        }
        return this.instanceName;
    }
}


답변

이 시도:

var classname = ("" + obj.constructor).split("function ")[1].split("(")[0];


답변

우리가 필요로하는 모든 것 :

  1. 함수에서 상수를 감싸십시오 (함수의 이름은 우리가 얻고 자하는 객체의 이름과 같습니다)
  2. 객체 내부에 화살표 기능 사용
console.clear();
function App(){ // name of my constant is App
  return {
  a: {
    b: {
      c: ()=>{ // very important here, use arrow function 
        console.log(this.constructor.name)
      }
    }
  }
}
}
const obj = new App(); // usage

obj.a.b.c(); // App

// usage with react props etc, 
// For instance, we want to pass this callback to some component

const myComponent = {};
myComponent.customProps = obj.a.b.c;
myComponent.customProps(); // App