如何从闭包中获取对象,这让我感到困惑,这是一个问题:
var o = function () {
var person = {
name: 'jonathan',
age: 24
}
return {
run: function (key) {
return person[key]
}
}
}
问题:如何在不更改源代码的情况下获取原始person
对象。
答案 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>