让实例化的 javascript 函数查找自己的名称是不好的还是不必要的

Is it bad or unnescessary to have an instantiated javascript function look up its own name?

本文关键字:不必要 自己的 javascript 实例化 函数 查找      更新时间:2023-09-26

我有几次让实例化的函数知道它自己的名字。

显而易见的解决方案是创建函数,以便您可以在创建函数时向其传递自己的名称并存储它:

instancename = new functionname('instancename')

。但我不是特别喜欢这样,它似乎很笨拙且容易出错(正如@thomas指出的那样,它无法在缩小中幸存下来(。 所以我在多个场合使用了这个函数的变体:

function pFunc( ){
    var retOb= {
        name: function(){
            if( typeof this.machinename == 'undefined' ) {
                for( thisObject in window ){
                    if( this === window[thisObject] ){
                            this.machinename = thisObject;
                    }
                }
            }
            return this.machinename;
        },
        makeDiv : function(){
            $(document.body).append( "<div>" + this.name() + " generated this div!</div>" );
        }
    }
    return retOb;
}

。有效地创建遍历 DOM 以查找其父级实例的子函数。

("makediv"函数只是为了举例说明我为什么要这样做。

几年前我第一次这样做时,我觉得我非常聪明......但我从未见过其他人这样做或建议它......所以我越来越担心这是不好的做法。

  1. 这是一个可怕的想法(为什么(?
  2. 是否没有必要(即,是否有更好或更可接受的方法让函数能够将自身标识到它创建的项目中(?

您可以使用:

arguments.callee.toString().match(/function ([^'(]+)/)[1]);

这将从函数内部获取名称。将其存储为属性,然后在需要时访问它。

现场示例:

http://codepen.io/anon/pen/jWXVJP

阅读有关此技术的更多信息:

http://www.esqsoft.com/javascript/functions/how-to-get-function-name-from-itself.htm

我要补充一点,你试图这样做很奇怪,我会考虑重新思考你做你想做的事情的方式。

这是一种不好的做法;他们两个。 首先,一旦您的应用程序使用命名空间或缩小器,这就会崩溃。

函数、属性或变量的名称不是你可以依赖的;引用才是!如果您希望特定函数识别它创建的实例,我建议您使用以下结构

function Foo(value){
    var me = Object.create(Foo.prototype);
    //process arguments, apply properties and methods
    me.value = value;
    return me;
}
//Foo.prototype...   //works
var obj = Foo("obj1");  //new-keyword has got optional
console.log(obj.value, obj instanceof Foo);     //obj is an instance of Foo
console.log(obj.constructor, obj.constructor === Foo);  //therefore the constructor...
//this starts to lead into a creepy direction; but you requested it
var obj2 = obj.constructor("obj2");
console.log(obj2.value, obj2 instanceof Foo);
console.log(obj2.constructor, obj2.constructor === Foo);