让实例化的 javascript 函数查找自己的名称是不好的还是不必要的
Is it bad or unnescessary to have an instantiated javascript function look up its own name?
我有几次让实例化的函数知道它自己的名字。
显而易见的解决方案是创建函数,以便您可以在创建函数时向其传递自己的名称并存储它:
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"函数只是为了举例说明我为什么要这样做。
几年前我第一次这样做时,我觉得我非常聪明......但我从未见过其他人这样做或建议它......所以我越来越担心这是不好的做法。
- 这是一个可怕的想法(为什么(?
- 是否没有必要(即,是否有更好或更可接受的方法让函数能够将自身标识到它创建的项目中(?
您可以使用:
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);
相关文章:
- 骨干模型默认值-todos.js示例中不必要的代码
- 让我自己的过滤器不工作
- RadTreeView在IE11不必要的触发事件中不起作用
- “期望赋值或函数调用,而是看到了表达式.” - 不必要的控制台.log
- 避免在 Angular.js 中对绑定值进行不必要的评估
- 避免在视差滚动效果中对图像进行不必要的缩放
- Redux防止不必要的渲染
- 动态加载的缩略图显示其他缩略图的全尺寸图像,而不是自己的缩略图(使用javascript悬停效果)
- Javascript - 预填充 cookie 信息,以在指向外部站点的链接上交叉传递不必要的登录页面
- AngularJS路由:URL中不必要的参数
- JavaScript,原型不能制作自己的方法
- 如果从自己的文件中调用函数,则不会触发 JSON 回调
- 简化这个不必要的JavaScript
- 创建多个叠加的折线图,这些折线图相对于彼此的数值而不是自己的数值
- 让实例化的 javascript 函数查找自己的名称是不好的还是不必要的
- 带有不必要括号的调车场算法
- 从MySQL到ArangoDB的导入始终不完整(自己的Node.js脚本)
- 从其他类继承原型方法,而不重写自己的原型方法
- ember中的动态路由显示父节点的模型,而不是自己的模型
- 可以浏览组合我的js文件不包括自己的代码