我有一个类似下面的代码,想要检测我的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.name
和this.parent.name
进行最后一小时的实验,但它们似乎不适用于我的情况。我一直都没有定义。
答案 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"