3

我有一个像下面这样的代码,想检测我的实例名称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它们似乎不适用于我的情况。我一直不确定。

4

3 回答 3

3

此代码的略微修改版本:

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

正如评论中所指出的,这通常是不可靠的,也是一个奇怪的想法。您可能想澄清为什么需要这样做 - 当然有更好的方法。

于 2013-08-09T10:35:00.157 回答
0

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

正如先前所说; 如果您需要一个唯一的 id 或名称,则在创建它时将其创建为 exScript 实例的属性。

如果您想确保 init 仅在this上下文是 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
于 2013-08-09T10:41:23.370 回答
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"
于 2015-04-06T04:32:30.223 回答