Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当新对象';它是从构造函数创建的_Javascript_Javascript Objects - Fatal编程技术网

Javascript 当新对象';它是从构造函数创建的

Javascript 当新对象';它是从构造函数创建的,javascript,javascript-objects,Javascript,Javascript Objects,我有一个包含调试/日志代码和自毁方法的构造函数 我试图在internet上查找有关如何在创建过程中检测新对象名称的信息,但我找到的唯一建议是将名称作为属性传递 比如说 var counter = {} counter.a =new TimerFlex({debug: true, timerId:'counter.a'}); 我发现没有必要将counter.a作为timerId传递:'counter.a'应该有一种本地方法来从构造函数或新对象实例检测名称 我正在寻找类似于ObjectProper

我有一个包含调试/日志代码和自毁方法的构造函数

我试图在internet上查找有关如何在创建过程中检测新对象名称的信息,但我找到的唯一建议是将名称作为属性传递

比如说

var counter = {}
counter.a =new TimerFlex({debug: true, timerId:'counter.a'});
我发现没有必要将counter.a作为timerId传递:'counter.a'应该有一种本地方法来从构造函数或新对象实例检测名称

我正在寻找类似于ObjectProperties('name')的返回counter.a的东西,所以我不需要手动将其作为属性包含

添加更多信息 @当然,我需要的是区分并行运行或嵌套运行的不同对象,以便在控制台中查看

counter.a data...
counter.b data...
counter.a data...
counter.c data... etc
此外,这些对象只有一个唯一的名称,没有引用为counter.a=counter.c

另一个特性或TimerFlex是一种自行设计的方法

 this.purgeCount = function(manualId) {

    if (!this.timerId && manualId) { 
      this.timerId = manualId;
      this.txtId =  manualId;
    } 

    if (this.timerId) {
      clearTimeout(this.t);
      this.timer_is_on = 0;
      setTimeout (  ()=> { console.log(this.txtId + " Destructed" ) },500);
      setTimeout ( this.timerId +".__proto__ = null", 1000);
      setTimeout ( this.timerId +" = null",1100);
      setTimeout ( "delete " + this.timerId, 1200);

    } else {
      if (this.debug) console.log("timerId is undefined, unable to purge automatically");
    }
  }

虽然我还没有这个构造函数的演示,但这与我在JavaScript中的前一个问题有关,您可以通过与字典相同的符号访问对象实例的属性。例如:
计数器['a']

如果您打算在新的
TimerFlex
实例中使用
counter.a
,为什么不直接传递
counter

counter.a = new TimerFlex({debug: true, timerId: counter});
// Somewhere within the logic of TimerFlex...
// var a = counter.a;

对象没有名称,但有构造函数

当通过变量访问时,Javascript对象是内存引用。对象是在内存中创建的,任何数量的变量都可以指向该地址

看看下面的例子

var anObjectReference = new Object();
anObjectReference.name = 'My Object'

var anotherReference = anObjectReference;
console.log(anotherReference.name);   //Expected output "My Object"
在上述场景中,当调用将返回变量名的假设方法时,对象返回
anObjectReference
anotherReference
是不合逻辑的

哪一个。。。。真的吗



在这种情况下,如果您想根据访问对象的变量来调节方法的执行,请将一个参数传递给您调用的方法以指示变量(或场景)。

这当然是可能的,但由于明显的原因,这有点难看。不用说,您必须尽量避免使用此类代码

但是,我认为这在调试中有一定的应用。我的解决方案利用使用
Error
对象获取代码行号的功能,然后读取源文件以获取标识符

let fs = require('fs');
class Foo {
    constructor(bar, lineAndFile) {
        this.bar = bar;
        this.lineAndFile = lineAndFile;
    }
    toString() {
        return `${this.bar} ${this.lineAndFile}`
    }
}
let foo = new Foo(5, getLineAndFile());

console.log(foo.toString()); // 5 /Users/XXX/XXX/temp.js:11:22
readIdentifierFromFile(foo.lineAndFile); // let foo

function getErrorObject(){
    try { throw Error('') } catch(err) { return err; }
}

function getLineAndFile() {
    let err = getErrorObject();
    let callerLine = err.stack.split("\n")[4];
    let index = callerLine.indexOf("(");
    return callerLine.slice(index+1, callerLine.length-1);
}

function readIdentifierFromFile(lineAndFile) {
    let file = lineAndFile.split(':')[0];
    let line = lineAndFile.split(':')[1];
    fs.readFile(file, 'utf-8', (err, data) => { 
        if (err) throw err; 
        console.log(data.split('\n')[parseInt(line)-1].split('=')[0].trim());
    }) 
}

如果希望将变量名与对象引用一起存储,则可以同步读取文件一次,然后在需要时解析它以从所需行号获取标识符

可以传递对象并将同一对象存储在多个变量中。一旦你写了
counter.c=counter.a
并且
a
c
都指向同一个对象,那么名称应该是什么呢?当你的代码依赖于一个保持不变的变量的名称时(例如,如果你的代码不能缩小),这就是代码应该重构的标志。最好更改
TimerFlex
,这样就不需要传递
计数器。在
timerId
@CertainPerformance中,我需要的是区分并行运行或嵌套运行的不同对象,以便我可以在控制台中看到。计数器。一个数据。。。计数器b数据。。。柜台a。。。柜台c。。。etcIt从代码中不太清楚您试图解决的问题是什么-如果您发布一个更完整的解决方案,很可能会有一个更优雅的解决方案可以发布,听起来您只需要区分计数器。那么你就不必在意这个属性叫什么,只要给它们起个名字就行了。这正是
console.time()
所做的-您只需启动一个命名计数器,然后
console.timeEnd()
按名称停止计数器,并给出结果。在你的例子中,你只需要报告哪个计数器有什么值,所以你甚至不需要一个
控制台。timeEnd
等价物只要运行
MyCounter(“某个名称”)
就可以给它一个标识符,然后
MyCounter.print()
将使用它。因为我可以让这些对象中的许多作为事件侦听器运行,可能有几百本,所以我不想污染全球范围,因为每一本都做着非常不同的事情,真的没有必要共享一本字典。