说我有一个对象
var BOB = {
"name": "bob",
"height": 185
};
我有另一个引用它的值的对象
var PROPS = {
"bob": {
"height": BOB.height
};
所以现在PROPS.bob.height
将等于185
。如果我对对象进行字符串化,我会得到
{"bob": {"height": 185}}
我可以计算出已评估的字符串值以返回值185
。例如从代码中找出源代码......:
var s = findOutTheSourceCode(PROPS);
// s would be
/*
{
"bob": {
"height": BOB.height
}
*/
答案 0 :(得分:0)
一般来说,没有。该信息无论如何都不存储。
如果代码是函数和的一部分,那么你引用了该函数和,你正在使用支持这种非标准功能的JS引擎,那么你可以调用thatfunction.toString()
,然后尝试使用(例如)模式匹配找到相关的代码位。
答案 1 :(得分:0)
从设计的角度来看,这是一个非常糟糕的想法。
无论如何,回答你的问题,简短的回答是“不,你不能”。
但是有一个丑陋的答案是肯定的,代价是依赖于使用 eval ,这是一个更糟糕的想法。例如:
var BOB = {
"name": "bob",
"height": 185
};
var PROPS_src = '{\n'
+ ' "bob": {\n'
+ ' "height": BOB.height\n'
+ ' }'
+ '}';
eval('var PROPS = '+PROPS_src);
console.log("PROPS_SRC:__________________");
console.log(PROPS_src);
console.log("PROPS:______________________");
console.log(PROPS);
// Output:
// PROPS_SRC:__________________
// {
// "bob": {
// "height": BOB.height
// }}
// PROPS:______________________
// { bob: { height: 185 } }
但是,正如我所说,所有这些都是非常糟糕的主意。我几乎不建议您以一种可以追踪数据来源的方式重新设计数据结构(以及代码,如果需要)。
对于(快速和肮脏)示例:
var people = {
bob: {
"name": "bob",
"height": 185
}
};
var props = {
"bob": {
"someConstant": "Hello World",
"_height": "height",
}
};
function getProps(who){
var out = {};
Object.keys(props[who]).map(function(k){
if (k.substring(0,1) == "_") {
out[k.substring(1)] = people[who][props[who][k]];
} else {
out[k] = props[who][k];
};
});
return out;
};
console.log("Raw:", props['bob']);
console.log("Calculated:", getProps('bob'));
// Output:
// Raw: { someConstant: 'Hello World', _height: 'height' }
// Calculated: { someConstant: 'Hello World', height: 185 }