在JavaScript中获取对象实例的名称

时间:2013-08-09 10:24:21

标签: javascript

我有一个类似下面的代码,想要检测我的exScript的实例名称。

在这种情况下,它将是exScript123

eecore = {
    something: 1,
    // ...
    someelse: function() { /* whatever */ };
};

var exScript = (function (undefined) {
    function exScript(inputOptions) {
        this.version = "0.0";
    }
    exScript.prototype.init = function () {
        // some code here
    };
    return exScript;
})();

eecore.exScript123 = new exScript();
eecore.exScript123.init();

我一直在使用arguments.calle.namethis.parent.name进行最后一小时的实验,但它们似乎不适用于我的情况。我一直都没有定义。

3 个答案:

答案 0 :(得分:3)

this code的略微修改版本:

function objectName(x, context, path) {

    function search(x, context, path) {
        if(x === context)
            return path;
        if(typeof context != "object" || seen.indexOf(context) >= 0)
            return;
        seen.push(context);
        for(var p in context) {
            var q = search(x, context[p], (path ? path + "." : "") + p);
            if(q)
                return q;
        }
    }

    var seen = [];
    return search(x, context || window, path || "");
}

在你的初始化函数中

    exScript.prototype.init = function () {
        console.log(objectName(this, eecore))
    };

正确打印exScript123

正如评论中指出的那样,这是不可靠的,一般来说是一个奇怪的想法。你可能想澄清你为什么需要它 - 当然有更好的方法。

答案 1 :(得分:0)

不确定为什么您需要知道指向对象实例的/ varialbe名称。如前所述,您可以将具有不同名称的多个变量指向同一个实例。

如前所述;如果您需要唯一的ID或名称,请在创建时将其创建为exScript实例的属性。

如果要确保init仅在this constext是exScript实例时执行,您可以执行以下操作:

var exScript = (function (undefined) {
    function exScript(inputOptions) {
        this.version = "0.0";
    }
    exScript.prototype.init = function () {
      // you can use (this instanceof exScript)
      // that will go up the prototype chain and see
      // if the current object is an instance of or inherits from
      // exScript
      // simple check: see if this is a direct instance of exScript
      if(this.constructor!==exScript){
        console.log("no good");
        return;
      }
      console.log("ok init");
      // some code here
    };
    return exScript;
})();

var e = new exScript();
e.init();//= ok init
setTimeout(e.init,100);//= no good

答案 2 :(得分:0)

简单的代码示例:

 function Parent(){
        // custom properties
    }

    Parent.prototype.getInstanceName = function(){
        for (var instance in window){
            if (window[instance] === this){
                return instance;
            }
        }
    };

    var child = new Parent();

    console.log(child.getInstanceName()); // outputs: "child"