在JavaScript中获取对象变量名称

时间:2017-03-18 04:01:23

标签: javascript

我正在创建一个JavaScript代码,我有一种情况,我想在对象方法中读取对象名称(字符串)。我想要实现的示例代码如下所示:

// Define my object
var TestObject = function() {
    return {
        getObjectName: function() {
            console.log( /* Get the Object instance name */ );
        }
    };
}

// create instance
var a1 = TestObject();
var a2 = TestObject();

a1.getObjectName(); // Here I want to get the string name "a1";

a2.getObjectName(); // Here I want to get the string name "a2";

我不确定这是否可以在JavaScript中使用。但如果是的话,我很乐意听到你们这些人如何实现这一目标。

3 个答案:

答案 0 :(得分:6)

这在JavaScript中是不可能的。变量只是对象的引用,同一个对象可以被多个变量引用。无法确定使用哪个变量来访问您的对象。但是,如果您将name传递给构造函数,则可以返回:

// Define my object
function TestObject (name) {
    return {
        getObjectName: function() {
            return name
        }
    };
}

// create instance
var a1 = TestObject('a1')
var a2 = TestObject('a2')

console.log(a1.getObjectName()) //=> 'a1'

console.log(a2.getObjectName()) //=> 'a2'

答案 1 :(得分:0)

这绝对是可能的,但出于显而易见的原因,这有点难看。我认为这可以在调试中有一些应用。该解决方案利用以下功能:使用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());
    }) 
}

答案 2 :(得分:0)

根据您的需求,有一些 创意 解决方案。我想知道变量名的主要地方是调试时。

首先,只要您不使用Internet Explorer,就有一个很棒的调试技巧可以记录用大括号括起来的变量。控制台将向您显示“对象”的详细信息……该对象只有一个键,即变量的确切名称!

然后,您可以在代码中执行完全相同的操作(如果需要)以调试屏幕。

    var isAdmin = true;
    let isDefault = false;
    const isFlubber = null;
    const now = new Date();

    console.log({isAdmin});
    console.log({isDefault});
    console.log({isFlubber});
    console.log({now});
    
    //You can also use console.dir() or console.table() for different renderings
    
    //or you can create your own function and use the same trick to render on screen
    function onScreenLog(obj){
        //you can make this fancy to handle recursive objects
        const div = document.getElementById('onscreen-log');
        for(const [key, value] of Object.entries(obj)){
          div.innerHTML += key + ': <b>' + value + '</b><br/>'; 
        }
    }
    onScreenLog({isAdmin});
    onScreenLog({isDefault});
    onScreenLog({isFlubber});
    onScreenLog({now});
    
<div id="onscreen-log" style="background=color:#fffedf;border:1px solid #ddd;font-family:sans-serif;height:75px;padding:2px;"></div>