Javascript 如何从闭包中获取对象?

Javascript 如何从闭包中获取对象?,javascript,closures,Javascript,Closures,如何从闭包中获取对象,这让我感到困惑,问题是: var o=函数(){ 个人变量={ 姓名:'乔纳森', 年龄:24 } 返回{ 运行:功能(键){ 返回人[键] } } } 问题:如何在不更改源代码的情况下获取原始person对象。您可以通过运行 o().run("<keyname>")) 只需toString函数,拉出所需的零件,然后eval将其作为对象。这是相当脆弱的,但要让它在不同的情况下工作可能会很困难 var o=函数(){ 个人变量={ 姓名:'乔纳森', 年龄

如何从闭包中获取对象,这让我感到困惑,问题是:

var o=函数(){
个人变量={
姓名:'乔纳森',
年龄:24
}
返回{
运行:功能(键){
返回人[键]
}
} 
}

问题:如何在不更改源代码的情况下获取原始
person
对象。

您可以通过运行

o().run("<keyname>"))

只需
toString
函数,拉出所需的零件,然后
eval
将其作为对象。这是相当脆弱的,但要让它在不同的情况下工作可能会很困难

var o=函数(){
个人变量={
姓名:'乔纳森',
年龄:24
}
返回{
运行:功能(键){
返回人[键]
}
} 
}
var person=eval('('+o.toString().substr(30,46)+'))
console.log(个人)
var o=function(){
个人变量={
姓名:'乔纳森',
年龄:24
}
返回{
运行:功能(键){
返回人[键]
}
}
}
Object.defineProperty(Object.prototype,“self”{
得到(){
归还这个;
}
});
console.log(o().run(“self”);//记录对象
o()。运行(“名称”)

它将返回“jonathan”。

只要你能做到这一点

<script type="text/javascript">
 var o = function () {
  var person = {
   name: 'jonathan',
   age: 24
  }
  return {
   run: function (key) {
       return person[key]
   }
  } 
 }
let a = new o;
alert(a.run('name'));
</script>

var o=函数(){
个人变量={
姓名:'乔纳森',
年龄:24
}
返回{
运行:功能(键){
返回人[键]
}
} 
}
设a=新o;
警报(a.run('name'));

人物对象或人物姓名或人物年龄?
{name:o().run(“name”)、age:o().run(“age”)}
如果您不知道属性名称,则可能重复的属性名称毫无意义。@NisargShah我可以查看代码并查看属性名称,或者可能它们被记录在案。。。lol@NisargShah据我所知,在不更改代码的情况下返回整个person对象是不可能的。既然OP说这是一个面试问题,我相信这是他应该做的。@epascarello我很肯定面试官并不期待得到这个答案。:)预期的答案是“你不能”。所有三个答案“不能”、“阅读道具”和“定义/评估”都表明了他们知道这个人无法直接访问的基本概念。对于否,我将继续回答另一个问题,即如何使用可用的方法“重新创建”。对于方法一,我会接着说为什么你不能直接得到“person”,这样我就能听到我认为他们知道的单词。另一个。。。。那个家伙疯了。免责声明,这是一个超级丑陋的黑客,在生产代码中使用它是不可取的。这可能对你的健康有不良影响。你的同事打你。我的意思是这很可怕,但表明你可以跳出框框思考。绝对不是我会在生产中使用的东西公平地说,这个面试问题很糟糕。所以,正如他们所说——问愚蠢的问题,得到愚蠢的答案。没错。在什么情况下,您需要在不更改源代码的情况下获取此信息?你永远不需要从外部访问处于关闭状态的东西。你知道吗?我真的想到了一个很好的理由。嗯,老实说,这不是最好的——从各方面考虑,这仍然是相对糟糕的,但现在是测试。如果您想为单元测试目的创建一个闭包,您可能需要“打破”一个闭包。还是1号比较好。使用专用的库2。编写单元可测试代码,然而,这仍然是我能想到的一个更合理的理由。其他一切都与糟糕的体系结构、糟糕的设计、糟糕的编码或这些因素有关。似乎我擅长:)@adiga这取决于你如何“源代码”。如果您的意思是“不要更改定义闭包的代码”,即OP中引用的内容,那么定义getter是有效的。如果这意味着不更改任何代码,那么根据定义,这是不可能的,因为你根本不允许更改任何东西。我会使用
符号
,而不是
“self”
,这样我就不会破坏任何可能定义了
“self”
(或任何其他键)的对象。(@VLAZ我不是认真的)@德米特里,我根本不会使用这个代码。实际上,没有人会有一个函数
o
,它返回一个人的钥匙?这是用来挑战面试的代码。