我正在创建一个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中使用。但如果是的话,我很乐意听到你们这些人如何实现这一目标。
答案 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>