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();

過去 1 時間、arguments.calle.nameandを使って実験してきましたthis.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 || "");
}

あなたのinit関数で

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

正しく印刷されexScript123ます。

コメントで指摘されているように、これは信頼性が低く、一般的に奇妙な考えです。なぜそれが必要なのかを明確にしたいかもしれません - 確かにもっと良い方法があります。

于 2013-08-09T10:35:00.157 に答える
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 に答える
0

オブジェクトのインスタンスを指す変数名を知る必要がある理由がわかりません。前に述べたように、異なる名前を持つ複数の変数が同じインスタンスを指すようにすることができます。

前に述べたように; 一意の ID または名前が必要な場合は、作成時に exScript インスタンスのプロパティとして作成します。

thisコンテキストが exScript のインスタンスである場合にのみ init が実行されるようにするには、次のようにします。

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 に答える