250

オブジェクトの関数名を取得するための解決策はありますか?

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。それらの1つを取得することは可能ですか?

4

8 に答える 8

431

オブジェクトのコンストラクター関数を取得し、そのnameプロパティを調べます。

myObj.constructor.name

「myClass」を返します。

于 2012-04-25T11:15:17.303 に答える
32

例:

function Foo () { console.log('Foo function'); }
var f = new Foo();
console.log('f', f.constructor.name); // -> "Foo"

var Bar = function () { console.log('Anonymous function (as Bar)'); };
var b = new Bar();
console.log('b', b.constructor.name); // -> "Bar"

var Abc = function Xyz() { console.log('Xyz function (as Abc)'); };
var a = new Abc();
console.log('a', a.constructor.name); // -> "Xyz"

class Clazz { constructor() { console.log('Clazz class'); } }
var c = new Clazz();
console.log('c', c.constructor.name); // -> "Clazz"

var otherClass = class Cla2 { constructor() { console.log('Cla2 class (as otherClass)'); } }
var c2 = new otherClass();
console.log('c2', c2.constructor.name); // -> "Cla2"

于 2013-11-21T13:27:05.460 に答える
5

標準の 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フィドル

于 2014-04-04T12:08:17.023 に答える
3

私は同様の問題に直面していましたが、ここで提示された解決策のどれも、私が取り組んでいたことに最適ではありませんでした. 私が持っていたのは、モーダルでコンテンツを表示するための一連の関数であり、関数、クラスのメソッドを作成する単一のオブジェクト定義の下でそれをリファクタリングしようとしていました。メソッドの1つがモーダル自体の内部にいくつかのナビゲーションボタンを作成し、関数の1つに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;
    }
}
于 2015-12-10T17:38:49.817 に答える
1

私達に必要なのは:

  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

于 2020-03-31T08:34:13.107 に答える