最近碰到一个javascript 的小问题,是和闭包有关的,来自cnode 论坛,很有意思。
var o = (function() { var person = { name: 'Vincent', age: 24 }; return { run: function(k) { return person[k]; } } })(); // TODO 在不改变上面代码的基础上,并且在只知道 person 是一个对象的基础上 // 只能在本段注释后面继续写代码,最终通过 o 打印出 person ,对于上文中的 person 即 `Object {name: "Vincent", age: 24}` // 例如 o.someThing = 1; cosnole.log(o.run('someThing')); // 在考虑到 person 为未知对象的基础上,尽可能写出更加完善的代码。 // 最终,如果不能完成该题,请尽可能的记录下来你思考的过程。
上面就是完整的题目。
借助object.prototype.__defineGetter__()可以实现这个功能。
Object.prototype.__defineGetter__("getClosureVariable", function(){ return this;//可以返回调用这个属性的对象 }); var person = o.run("getClosureVariable"); console.log(person);
__defineGetter__()的其它应用,例如,获取一个文档元素的tagname
HTMLElement.prototype.__defineGetter__("myTagName",function(){ return this.tagName; }) console.log(document.getElementById("mySpan").myTagName);
<span id="mySpan"></span>