我有一个类似于下面的代码,并希望检测我的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进行实验,但在我的情况下,它们似乎不起作用。我一直搞不清楚。
发布于 2013-08-09 10:35:00
稍微修改过的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 || "");
}在你的init功能中
exScript.prototype.init = function () {
console.log(objectName(this, eecore))
};正确打印exScript123。
正如评论中指出的那样,这是不可靠的,而且总体上是一个奇怪的想法。你可能想要澄清你为什么需要那个--当然还有更好的方法。
发布于 2013-08-09 10:41:23
不确定为什么需要知道指向对象实例的/变量名称。如前所述,可以有多个名称不同的变量指向同一个实例。
如前所述,如果您需要一个惟一的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发布于 2015-04-06 04:32:30
简单的代码示例:
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"https://stackoverflow.com/questions/18144588
复制相似问题