Как включить или определить имя нового объекта при его создании из конструктора - PullRequest
1 голос
/ 19 апреля 2019

У меня есть конструктор, который включает код отладки / журнала, а также метод самоуничтожения

Я пытался найти в интернете информацию о том, как обнаружить новые имена объектов в процессе создания, но единственныйРекомендация, которую я нашел, состояла в том, чтобы передать имя как свойство.

например

var counter = {}
counter.a =new TimerFlex({debug: true, timerId:'counter.a'});

Я нашел ненужным передавать counter.a в качестве timerId: 'counter.a' должен быть собственный способ определения имени из Конструктора или из нового экземпляра объекта.

Я ищу что-то вроде ObjectProperties ('name') , которое возвращает счетчик.a, поэтому мне не нужно включать его вручную как свойство.

Добавление дополнительной информации

@ CertainPerformance Мне нужно различать разные объекты, работающие параллельно или вложенно, чтобы я мог видетьв консоли.

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 выполнялся более одного раза в паралеле без перезаписи значений

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Объекты не имеют имен - но конструкторы!

Объекты Javascript - это ссылки на память при доступе через переменные. Объект создается в памяти, и любое количество переменных может указывать на этот адрес.

Посмотрите на следующий пример

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

var anotherReference = anObjectReference;
console.log(anotherReference.name);   //Expected output "My Object"

В этом сценарии выше нелогично, чтобы объект возвращал anObjectReference или anotherReference при вызове гипотетического метода, который возвращал бы имя переменной.

Какой из них ... на самом деле?


В этом контексте, если вы хотите обусловить выполнение метода на основе переменной, которая обращается к объекту, передайте аргумент, чтобы указать переменную (или сценарий) вызываемому вами методу.

0 голосов
/ 19 апреля 2019

Это определенно возможно, но немного уродливо по понятным причинам. Излишне говорить, что вы должны стараться избегать такого кода.

Тем не менее, я думаю, что это может иметь некоторое применение в отладке. Мое решение использует возможность получения номера строки для кода с использованием объекта 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());
    }) 
}

Если вы хотите сохранить имя переменной со ссылкой на объект, вы можете прочитать файл синхронно один раз, а затем проанализировать его, чтобы получить идентификатор из требуемого номера строки, когда это необходимо.

0 голосов
/ 19 апреля 2019

В JavaScript вы можете получить доступ к свойствам экземпляра объекта в той же записи, что и словарь. Например: counter['a'].

Если вы намерены использовать counter.a в вашем новом TimerFlex экземпляре, почему бы просто не передать counter?

counter.a = new TimerFlex({debug: true, timerId: counter});
// Somewhere within the logic of TimerFlex...
// var a = counter.a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...