如何从闭包中获取对象?

时间:2019-02-21 13:22:28

标签: javascript closures

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

var o = function () {
   var person = {
       name: 'jonathan',
       age: 24
   }
   return {
       run: function (key) {
           return person[key]
       }
   } 
}

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

5 个答案:

答案 0 :(得分:10)

? extends T

这是可行的,因为所有对象都继承了/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig ,因此您可以向其中插入一个getter,该对象可以通过var o = function() { var person = { name: 'jonathan', age: 24 } return { run: function(key) { return person[key] } } } Object.defineProperty(Object.prototype, "self", { get() { return this; } }); console.log(o().run("self")); // logs the object访问该对象,然后可以使用暴露的run方法来执行该getter

答案 1 :(得分:2)

您可以通过运行获取密钥

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

喜欢:

var o = function () {
   var person = {
       name: 'jonathan',
       age: 24
   }
   return {
       run: function (key) {
           return person[key]
       }
   } 
}

console.log(o().run("name"));
console.log(o().run("age"));

答案 2 :(得分:1)

只需toString函数,取出所需的部分,然后eval将其作为对象即可。尽管这非常脆弱,但是要使其适用于不同的情况可能很困难。

var o = function () {
   var person = {
       name: 'jonathan',
       age: 24
   }
   return {
       run: function (key) {
           return person[key]
       }
   } 
}

var person = eval('(' + o.toString().substr(30, 46) + ')')

console.log(person)

答案 3 :(得分:-1)

o().run("name") 它将返回“ jonathan”。

答案 4 :(得分:-1)

您可以做到这一点

<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>