常建57

路漫漫其修远兮。。。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近碰到一个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 为未知对象的基础上,尽可能写出更加完善的代码。
    // 最终,如果不能完成该题,请尽可能的记录下来你思考的过程。
View Code

上面就是完整的题目。

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

 

posted on 2015-06-16 23:42  常建57  阅读(274)  评论(0编辑  收藏  举报